Android 学习笔记 6 组件通信及广播消息(一)

Intent的概念

Intent的官方解释是“An Intent is a messaging object you can use to request an action from another app component. ”这里的app component就是指安卓activity,service,contentprovider,broadcastreceiver四大组件。不同的intent可以使这些组件产生相应的动作,为这些组件之间提供了交互能力。那么这个“messaging object”具体的用途有“启动一个activity”,“启动一个service”,“提供一个Broadcast”。

创建和注册一个新的Activity

首先,编写一个类。该类需要继承自Activity。根据Activity的生命周期,通常重写onCreate方法完成该Activity子类的初始化,并且必须用 setContentView()来定义Activity布局,以对Activity进行初始化。
创建secondActivity类
public class SecondActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
	}
}

并为其定义布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
<TextView 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/second_activity"/>
</LinearLayout>

这里string/second_activity定义显示的文字。

第二步,注册该Activity子类。注册文件所在位置是/项目名/AndroidManifest.xml文件,修改该文件,注册编写的Activity子类。
笔记四中提到AndroidManifest.xml是“Android项目的配置文件。Android项目中所使用的各种组件均需要在此文件中进行注册”,故新添加的activity要在AndroidManifest.xml中进行注册。事实上,用户使用的每个组件都必须在AndroidManifest.xml文件中的<application>节点内定义。
修改后的AndroidManifest.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.learnerkiwi"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity       <!--在这里注册了second_activity-->
             android:name=".second_activity"
             android:label="@string/second_activity"/>
    </application>

</manifest>

实现由MainActivity对SecondActivity的显式启动

大致想法是要在MainActivity上放置一个按钮,然后通过点击按钮启动SecondActivity。

首先在MainActivity.xml上添加一个button组件的布局

<Button
        android:id="@+id/start_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="20dp"
        android:text="@string/start_button"
        />

之后修改MainActivity.java中的onCreate()方法

protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.start_button); 
        //设置点击事件
        button.setOnClickListener(new OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                //生成意图,第二个参数为要启动的activity
                Intent intent = new Intent(MainActivity.this, 
                        second_activity.class);
                startActivity(intent);
            }
        });

这里实现了一个onClickListener的匿名内部类,其中重写了onClick()方法,在方法里面构造生成了一个新的Intent对象。

Intent的构造方法为 Intent(Context packgeContext ,Class <?> cls );两个构造参数分别指明了当前组件的类名和目标组件的类名,同时制定两个组件类是因为在Android中有一个活动栈,这样的构造方式才能确保正确的将前一个组件的活动压入栈中,才能在触发返回键的时候前一个组件活动能够正确出栈。

接下来一句startActivity函数是Activity类自带的方法,intent作为参数。由于intent中封装了目标组件的类,通过该方法就可以启动目标组件了。

原文地址:https://www.cnblogs.com/kiwibird/p/4915989.html