您现在的位置是:首页 >其他 >使用意图intent构建一个多活动的Android应用网站首页其他
使用意图intent构建一个多活动的Android应用
安卓意图Intent是Android应用组件(Activity、Service、Broadcast Receiver)之间进行交互的一种重要方式。Intent允许启动一个活动、启动一个服务、传递广播等。Intent使应用能够响应系统及其他应用的动作。Intent使用的主要目的有:
1、 启动Activity:可以启动自己应用内的Activity,也可以启动其他应用的Activity。例如,打电话、发短信、打开地图等。
2、 启动Service:启动后台Service来执行耗时任务。例如,播放音乐,网络下载文件等。
3、 发送和接收广播:发送广播到其他应用,或者接收系统和其他应用的广播。例如,电量变化、时间变化等广播。
4、 传递数据:通过Intent可以在Activity、Service、Broadcast Receiver之间传递数据。例如,从一个Activity传递数据到另一个Activity。
Android的四大组件(Activity、Service、Broadcast Receiver、Content Provider)都是通过Intent来互相通信的。所以Intent机制是Android应用组件之间的重要联系纽带,它使得Android应用变得松耦合、功能更加灵活,这也是Android应用框架的精髓所在。总之,学好Intent机制,知道如何通过Intent在各组件之间跳转传值,是开发Android应用的重要一环。熟练使用Intent可以让我们的应用具有更强的扩展性和交互性。
下面来借助intent实现一个多活动的Android意图:
活动是用户能完成的一个确定的事情。如果能把多个活动串在一起来完成某个复杂的工作,这称为一个任务。比如显示一个菜单就是一个活动,如果应用很简单,一个活动就足够了。很多情况下,用户不只是做一件事情,这就需要使用多个活动了,比如一个用来显示菜谱,一个用来增加菜谱。
下面来构建一个包含两个活动的应用,第一个活动允许输入一个消息,单击第一个活动中的按钮时,它会启动第二个活动,并传入这个消息。第二个活动再显示这个消息。
这个应用包含两个活动两个布局:
1、应用运行时,首先会启动活动CreateMessageActivity。
这个活动使用布局activity_create_message.xml。
2、用户单击CreateMessageActivity中的按钮,这回启动活动ReceiveMessageActivity。这个活动使用布局activity_receive_message.xml。
创建工程
使用AS新建一个Android工程,应用名为My Messenger,公司域名为hfad.com。最低SDK为API19保证能在大多数设备上都能运行。需要创建一个CreateMessageActivity的空活动,相应布局名为activity_create_message。确保创建活动时不要选中Backwards Compatibility(AppCompat)选项。
activity_create_message.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:orientation="vertical"
tools:context="com.hfad.mymessenger.CreateMessageActivity"
>
<EditText
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:hint="@string/hint"
android:ems="10"
/>
<Button
android:id="@+id/send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="onSendMessage"
android:text="@string/send"
/>
</LinearLayout>
EditText元素定义了一个可编辑的文本域,用来输入文本。
hint属性为用户提供一个提示,指出应当在这个文本域键入什么文本。我们需要把它增加为一个字符串资源。
ems属性描述EditText该有多宽,其宽度足以容纳几个字母m
然后更新string.xml
<resources>
<string name="app_name">My Messenger</string>
<string name="send">Send Message</string>
<string name="hint">Enter a message</string>
<string name="chooser">Send message via...</string>
</resources>
打开CreateMessageActivity.java文件,把AS为你创建的代码替换为以下代码:
package com.hfad.mymessenger;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
//确保继承了Activity类
public class CreateMessageActivity extends Activity {
@override
//创建活动时会调用onCreate()方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_message);
}
//单击按钮时会调用这个方法
public void onSendMessage(View view){
//从ID为message的可编辑文本域得到文本
EditText messageView = (EditText)findViewById(R.id.message);
String messageText = messageView.getText().toString();
//创建意图,指定了将要接收这个意图的活动。就像在信封上写地址一样。
//第一个参数告诉Android这个意图来自哪个对象,可以用this表示当前对象
//第二个参数是需要接收这个意图的那个活动的类名
Intent intent = new Intent(this, ReceiveMessageActivity.class);
//将这个文本增加到意图,指定名为message
intent.putExtra(ReceiveMessageActivity.EXTRA_MESSAGE, messageText);
//启动意图中指定的活动
startActivity(intent);
}
}
右击包名new一个activity,命名为ReceiveMessageActivity,布局命名为activity_receive_message,另外不要选中Launcher Activity和Backwards Compatibility。
到目前为止,我们已经创建了一个包含两个活动的应用,而且每个活动都有自己的布局,接下来要做的就是在用户单击Send Message按钮时让CreateMessageActivity调用ReceiveMessageActivity。要让活动启动另一个活动,需要使用一个意图intent。可以把intent看作是一个想要做某件事的意图,意图是一个消息类型。
activity_receive_message.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:orientation="vertical"
tools:context="com.hfad.mymessenger.ReceiveMessageActivity"
>
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
ReceiveMessageActivity.java
package com.hfad.mymessenger;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class ReceiveMessageActivity extends Activity {
public static final String EXTRA_MESSAGE = "message";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_receive_message);
Intent intent = getIntent();
String messageText = intent.getStringExtra(EXTRA_MESSAGE);
TextView messageView = (TextView)findViewById(R.id.message);
messageView.setText(messageText);
}
}
GitHub:https://github.com/dogriffiths/HeadFirstAndroid2ndEdition/tree/master/chapter03/MyMessenger