Android Intent的隱示啟動(啟動其他APP介面並傳遞資料)
引用
1、 ofollow,noindex">Android中Intent的隱式啟動和顯示啟動Activity
3、 (備忘)Android app中呼叫啟動其他應用(系統應用和第三方應用)
基礎
概念
- 顯式啟動:直接指定要跳轉的Activity類名,不用過濾,效率高,適用於同一個應用中的不同Activity跳轉
- 隱式啟動:需要過濾,相對耗時,但可以找到所有之匹配的應用。適用於不同應用之間的Activity跳轉。
屬性
- component(元件):目的元件
- action(動作):用來表現意圖的行動
- category(類別):用來表現動作的類別
- data(資料):表示與動作要操縱的資料
1、android:schema=用於指定資料的協議部分,如上例中的http部分
2、android:host=用於指定資料的主機名部分,如上例中的 www.baidu.com 部分
3、android:port=用於指定主機名和埠之後的部分,一般緊隨在主機名之後
4、android:mimeType=用於指定可以處理的資料型別,允許使用萬用字元的方式進行指定 - type(資料型別):對於data範例的描寫
- extras(擴充套件資訊):擴充套件資訊
- Flags(標誌位):期望這個意圖的執行模式
截圖

implicit_activity.png
程式碼
一、同一個APP內
1、顯示啟動:最最最普通的啟動啦~~
Intent it = new Intent(instance, FirstActivity.class); startActivity(it);
2、隱示啟動:作業系統的一些介面
- 開啟系統設定
//action = Settings.ACTION_SETTINGS = android.settings.SETTINGS Intent it = new Intent(Settings.ACTION_SETTINGS); startActivity(it);
- 打電話:這裡就有action動作和設定傳遞的data資料
//action = Intent.ACTION_DIAL = android.intent.action.DIAL Intent it = new Intent(); it.setAction(Intent.ACTION_DIAL); it.setData(Uri.parse("tel:10086"));//定位 startActivity(it);
Intent it = new Intent(); it.setAction(Intent.ACTION_VIEW); it.setData(Uri.parse("http://www.baidu.com")); startActivity(it);
-
其他更多的:
3、隱示啟動:開啟APP內其他活動頁
-
同一個action被多個activity活動頁接受的情形
1、manifest清單檔案中有兩個activity:XXX和YYY
2、XXX和YYY都有相同的3、
4、暫無data和type
5、6、

app2.png
<activity android:name=".module.study.components.activity.ex_or_implicit.XXXActivity" android:screenOrientation="portrait"> <!--隱示啟動預設帶的類別就是:android.intent.category.DEFAULT,必須要加--> <intent-filter> <action android:name="com.test.implicit"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="xxx"/> </intent-filter> </activity> <activity android:name=".module.study.components.activity.ex_or_implicit.YYYActivity" android:screenOrientation="portrait"> <!--隱示啟動預設帶的類別就是:android.intent.category.DEFAULT,必須要加--> <intent-filter> <action android:name="com.test.implicit"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="yyy"/> </intent-filter> </activity>
//這個action在manifest中顯然會匹配到兩個activity,然後會讓你選擇一個 String action_xxx_or_yyy = "com.test.implicit"; Intent it = new Intent(); it.setAction(action_xxx_or_yyy); startActivity(it);
- 同一個action,又被category過濾了一遍,指向一個activity活動頁
String action_xxx = "com.test.implicit"; String category_xxx = "xxx"; Intent it = new Intent(); it.setAction(action_xxx);//動作 it.addCategory(category_xxx); //類別 startActivity(it);
二、另一個APP
1、隱示啟動:開啟特定APP,全路徑:2個引數:applicationId包名和工程目錄下對應的畫面
//method 1 Intent it = new Intent(); it.setClassName("com.xxx","com.xxx.MainActivity"); it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(it); //method 2 帶action表示app的啟動頁面:ACTION_MAIN Intent it = new Intent(); ComponentName cn = new ComponentName("com.xxx","com.xxx.MainActivity"); it.setComponent(cn); it.setAction(Intent.ACTION_MAIN);//android.intent.action.MAIN it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(it);
多渠道的 applicationId = com.jiangsu.nantong.testapp ,實際工程目錄的根目錄是com.china.testapp
Intent it = new Intent(); it.setClassName("com.jiangsu.nantong.testapp","com.china.testapp.MainActivity"); it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(it);
2、隱示啟動:開啟某個APP活動,都會被過濾到action的情景

other_app2.png
-
兩個APP定義一樣的action,不同的category
MyApp
<activity android:name=".ImplicitActivity" android:exported="true"> <intent-filter> <!--action 一樣的--> <action android:name="test_implicit"/> <!--category 多渠道每個不一樣--> <category android:name="my_category"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
YourApp
<activity android:name=".ImplicitActivity" android:exported="true"> <intent-filter> <!--action 一樣的--> <action android:name="test_implicit"/> <!--category 多渠道每個不一樣--> <category android:name="your_category"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
HelloApp 隱示過濾啟動,找到2個
//這個action在manifest中顯然會匹配到兩個activity,然後會讓你選擇一個 String test_implicit = "test_implicit"; Intent it = new Intent(); it.setAction(test_implicit); it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(it);
3、隱示啟動:開啟特定APP活動,並互相傳遞資料
- 這裡由action和category2層過濾,找到特定的app的活動,傳遞資料的話和以前一樣
//隱示啟動:指定某個APP的活動 private void startImplicitOtherSingleApp() throws Exception{ String test_implicit = "test_implicit"; String category_your = "your_category"; Intent it = new Intent(); it.setAction(test_implicit);//動作 it.addCategory(category_your); //類別 //it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); it.putExtra("msg","Hello man, I'm HelloApp, Are you ok?"); startActivityForResult(it,1001); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { LogUtil.i("requestCode = "+requestCode + ", resultCode = "+); if(resultCode != RESULT_OK){ return; } if(requestCode == 1001){ String msg = data.getStringExtra("msg"); LogUtil.i(msg); ToastUtil.showShort(instance, msg); } //super.onActivityResult(requestCode, resultCode, data); }
三、其他
1、啟動APP頁面一般要詢問是否有,提供幾個方法吧
/** * 檢測某個應用是否安裝 * * @param context * @param packageName * @return */ public static boolean isAppInstalled(Context context, String packageName) { try { context.getPackageManager().getPackageInfo(packageName, 0); return true; } catch (PackageManager.NameNotFoundException e) { return false; } } /** * 檢測某個應用是否安裝 * * @param context * @param intent * @return */ public static boolean isAppInstalled(Context context, Intent intent){ List acts = context.getPackageManager(). queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); return (acts.size() > 0); } /** * 檢測某個應用是否安裝 * * @param context * @param intent * @return */ public static boolean isAppInstalled2(Context context, Intent intent){ return (intent.resolveActivity(context.getPackageManager()) != null); }
2、關於data下schema等跳轉沒講,到另一篇文章講,留個坑在此處
-------------一年馬上又要過去了,感覺很忙,又好像啥事都沒幹。。。