ComponentName,顧名思義,就是組件名稱,通過調用Intent中的setComponent方法,我們可以打開另外一個應用中的Activity或者服務。
實例化一個ComponentName需要兩個參數,第一個參數是要啟動應用的包名稱,這個包名稱是指清單文件中列出的應用的包名稱:

第二個參數是你要啟動的Activity或者Service的全稱(包名+類名),代碼如下:
啟動一個Activity:
[java] view plain copy PRint?Intent intent = new Intent(); intent.setComponent(new ComponentName("com.example.otherapp", "com.example.otherapp.MainActivity2")); startActivity(intent);啟動一個Service:
[java] view plain copy print?Intent it = new Intent(); it.setComponent(new ComponentName("com.example.otherapp", "com.example.otherapp.MyService")); startService(it);注意
如果你要的啟動的其他應用的Activity不是該應用的入口Activity,那么在清單文件中,該Activity節點一定要加上Android:exported="true",表示允許其他應用打開,對于所有的Service,如果想從其他應用打開,也都要加上這個屬性:
[java] view plain copy print?<service android:name="com.example.otherapp.MyService" android:exported="true" > </service> <activity android:name="com.example.otherapp.MainActivity2" android:exported="true" > </activity> 對于除了入口Activity之外的其他組件,如果不加這個屬性,都會拋出“java.lang.SecurityException: Permission Denial.....”異常那么為什么入口Activity不用添加這個屬性就可以被其他應用啟動呢?我們來看一段入口Activity的注冊代碼:
[java] view plain copy print?<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和普通Activity唯一不同的地方就是入口Activity多了一個過濾器,對于包含了過濾器的組件,意味著該組件可以提供給外部的其他應用來使用,它的exported屬性默認為true,相反,如果一個組件不包含任何過濾器,那么意味著該組件只能通過指定明確的類名來調用,也就是說該組件只能在應用程序的內部使用,在這種情況下,exported屬性的默認值是false。新聞熱點
疑難解答