先看效果圖
概述
在介紹Component之前,我們首先來了解ComponentName這個類;ComponentName與Intent同位於android.content包下,我們從Android官方文檔中可以看到,這個類主要用來定義可見一個應用程序組件,例如:Activity,Service,BroadcastReceiver或者ContentProvider。
那么,如何用ComponentName來定義一個組件呢。這是ComponentName的構造函數:ComponentName(String pkg,String cls) 。我們知道在Android應用程序中如果要詳細描述一個組件我們需要知道該組件所在的應用包名,也就是在AndroidManifest.xml文件中manifest根結點下的package=“XXX.XXXXX.XXXXX",還有組件在應用程序中的完整路徑名,拿Activity來說,也就是activity節點中name屬性的值。因此到這里我們也就明白了可以使用ComponentName來封裝一個組件的應用包名和組件的名字。
我們已經知道,在Android中組件之間的交流往往使用意圖(Intent)來完成的,那么在Intent中有一個方法可以封裝一個ComponentName,最后我們在使用意圖去完成我們需要實現的功能。
簡單示例
下面我們用具體的代碼來描述如何使用ComponentName來幫助我們與其他應用程序交互:
首先我們要新建兩個Android應用程序,appsend和appreceiver。appreceiver的AndroidMainfest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.appreceiver" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.appreceiver.MainActivity"</span></strong> android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
appsend中的啟動Activity的片段:
public void button(View view) { ComponentName cn=new ComponentName("com.example.appreceiver", "com.example.appreceiver.MainActivity"); Intent intent = new Intent(); intent.setComponent(cn);</span></strong> startActivityForResult(intent, 2); }
.componentName(組件名稱),指定Intent的目標組件的類名稱。組件名稱是可選的,如果填寫,Intent對象會發送給指定組件名稱的組件,否則也可以通過其他Intent信息定位到適合的組件。組件名稱是個ComponentName類型的對象。
用法:
Intent intent = new Intent();
// 構造的參數為當前Context和目標組件的類路徑名
ComponentName cn = new ComponentName(HelloActivity.this, "com.byread.activity.OtherActivity");
intent.setComponent(cn);
startActivity(intent);
相當於以下常用方法:
Intent intent = new Intent();
intent.setClass(HelloActivity.this, OtherActivity.class);
startActivity(intent);
Intent類中也包含一個初始化ComponentName的構造函數:
public Intent(Context packageContext, Class<?> cls) {
mComponent = new ComponentName(packageContext, cls);
}
Demo代碼
package mm.shandong.com.testcomponent; import android.content.ComponentName; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class TestComponentActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test_component); ComponentName componentName=getIntent().getComponent(); Toast.makeText(this,"組件包名:"+componentName.getPackageName()+ "。\n組件類名:"+componentName.getClassName(),Toast.LENGTH_LONG).show(); } public void startActivityFirst(View view){ Intent intent=new Intent(); ComponentName componentName=new ComponentName(TestComponentActivity.this,TestComponentOtherActivity.class); intent.setComponent(componentName); startActivity(intent); } public void startActivitySecond(View view){ Intent intent=new Intent(); intent.setClass(TestComponentActivity.this,TestComponentOtherActivity.class); startActivity(intent); } public void startActivityThird(View view){ Intent intent=new Intent(TestComponentActivity.this,TestComponentOtherActivity.class); startActivity(intent); } public void startActivityFourth(View view){ Intent intent=new Intent(); String packageName=getPackageName(); ComponentName componentName=new ComponentName(packageName,"mm.shandong.com.testcomponent.TestComponentOtherActivity"); intent.setComponent(componentName); startActivity(intent); } public void startActivityFifth(View view){ Intent intent=new Intent(); ComponentName componentName=new ComponentName(TestComponentActivity.this,"mm.shandong.com.testcomponent.TestComponentOtherActivity"); intent.setComponent(componentName); startActivity(intent); } }
本人微博:honey_11
Demo下載
最后,以上例子都來源與安卓無憂,請去應用寶或者豌豆莢下載:例子源碼,源碼例子文檔一網打盡