其實,這本來是一件很簡單的事情,但是我發現很多人問我這個問題,所以寫篇小文章供參考。
系統提供了很多可以直接調用的Activity,通過指定的Intent就可以調用,比如打開搜索的:
- Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
- intent.putExtra(SearchManager.QUERY,"searchString")
- startActivity(intent);
Intent.ACTION_WEB_SEARCH是一個字符串,是“搜索”這個Activity的標識,extra是傳給這個activity的一些數據。發送出這個intent之後,系統根據action字符串Intent.ACTION_WEB_SEARCH知道了是要調用哪個activity,如果有重名,會彈出一個選擇對話框。然後打開此activity,實現想要做的事情。
那麼,我們自己怎麼來實現呢。
首先,寫一個activity,在AndroidManifest.xml裏面的intent-filter中,給這個activity命名,
- <intent-filter>
- <action android:name="chroya.foo"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
然後安裝。安裝完畢之後,你會發現,系統中找不到這個程序。別急,它確實安裝在手機裏面了,但是因爲他不是main的,所以系統不會把他當做Application的入口程序。
而要想打開這個activity,只有知道它名字的人纔可以。跟系統的intent一樣使用。它的名字定義爲"chroya.foo",所以,這裏用這個字符串就可以調用它了:
我用剛纔舉的那個系統的intent說明,它的activity裏面使用getIntent().getBundleExtra(SearchManager.QUERY)來接收傳遞進來的搜索字符串參數。而這個SearchManager.QUERY是關鍵字。如果要自己實現這種功能,只需要定義好關鍵字,然後從BundleExtra中取就行了
寫短信羣發小工具,當發送成功後,想跳動到系統自帶的已發送或者發件箱,網上搜了下。開始關鍵字沒輸好,搜不到,結果用一個apk啓動另一個apk就搜到了。
方法如下,
1
2 3 4 5 |
Intent mIntent = new Intent( );
ComponentName comp = new ComponentName("包名", "類名"); mIntent.setComponent(comp); mIntent.setAction("android.intent.action.VIEW"); startActivity(mIntent); |
怎麼找到要啓動的activity呢,手機連接logcat,啓動下那個想要通過代碼啓動的那個應用程序,就能看到了。例如本例,啓動信息的那個apk時,logcat打印出
1
2 |
07-13 09:22:15.104: INFO/ActivityManager(59): Starting
activity: Intent {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000
cmp=com.android.mms/.ui.ConversationList }
07-13 09:22:17.675: INFO/ActivityManager(59): Displayed activity com.android.mms/.ui.ConversationList: 2478 ms (total 2478 ms) |
然後帶入上面的就是
1
2 3 4 |
ComponentName comp = new ComponentName("com.android.mms","com.android.mms.ui.ConversationList");
mIntent.setComponent(comp); mIntent.setAction("android.intent.action.VIEW"); startActivity(mIntent) |
logcat輸出的信息com.android.mms/.ui.ConversationList中,/前面的是包名,我試着把/後面的類名帶入也不行,提示activityNotfound。最後/後面的類名也把包名加完整即可,及上面所示com.android.mms.ui.ConversationList。