需求:
分享內容頁面中有一個按鈕,點擊跳轉到APP中的指定的某個頁面,例如分享了一個文章頁面,點擊按鈕跳轉到APP的文章詳情頁面
頁面跳轉邏輯分析:
情景1:用戶未安裝APP,點擊跳轉直接跳轉下載鏈接即可
情景2:用戶安裝了APP且已經打開APP(或者APP掛在后臺),點擊跳轉按鈕直接跳轉至文章詳情頁,點擊回傳就回傳到APP之前所處的頁面
情景3:用戶安裝了APP未打開APP(冷啟動),點擊跳轉按鈕直接跳轉至文章詳情頁,點擊回傳就回傳到APP首頁
實作:
步驟1:在目標Activity清單檔案中添加配置資訊
首先需要用到需要使用到 Android Activity中的 <intent-filter>,可以用APP啟動頁面作為決議跳轉的Activity,配置如下:
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
//app唯一標記
android:scheme="testscheme"/>
</intent-filter>
現在這個 Activity 就具備外部喚醒的能力了,注意下 <data> 中的相關配置,如上配置,外部的鏈接形式應該就是這樣的了:testscheme://xxx ,
步驟2:跳轉處理,主要處理情景2和情景3
情景1:用戶未安裝APP,點擊跳轉直接跳轉到下載鏈接即可,如需帶引數安裝,安裝完成跳轉到指定頁面可接第三方平臺,此處不做過多解釋,第三方平臺很多,比如友盟、openinstall、shareinstall、xinstall 等
情景2:已經安裝APP,且已經打開(或運行在后臺)
在目標Activity的onCreate方法中匹配H5規則, 獲取業務資料
Intent intent = getIntent();
Uri uri = null;
if(intent != null) {
uri = intent.getData(); //獲取H5規則, 可攜帶資料
String scheme = getIntent().getScheme();
Log.i("TAG","scheme" + scheme);
}
if (uri != null) {
isFromBrowser = true; //區分是否從瀏覽器喚起的標記,自行定義成員變數
String test_param = uri.getQueryParameter("test_param");//自定義攜帶引數
}
首先確認APP有一個必須要啟動的頁面,一般是APP的首頁,進而判斷APP是否處于運行狀態,思路是判斷首頁是否在堆疊內,判斷方法如下:
public static boolean isLaunchedActivity(@NonNull Context context, Class<?> clazz) {
Intent intent = new Intent(context, clazz);
ComponentName cmpName = intent.resolveActivity(context.getPackageManager());
boolean flag = false;
if (cmpName != null) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfoList = am.getRunningTasks(10);
for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {
if (taskInfo.baseActivity.equals(cmpName)) {
flag = true;
break;
}
}
}
return flag;
}
接下來結合isFromBrowser=true和isLaunchedActivity=true判斷APP已經啟動,并且是由外部瀏覽喚醒,則直接啟動詳情頁:
Intent intent = new Intent(context, ArticleContentActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//加上Intent.FLAG_ACTIVITY_NEW_TASK的Flag,不然就在瀏覽器所在的堆疊里面了
startActivity(intent);
如果此時已經啟動了詳情頁,再次從瀏覽器喚醒到APP的時候就會打開2個重復的詳情頁,解決方法:
android:launchMode="singleTop"//如果是多個頁面復用一個webview, 則此方式不適用
情景三:已經安裝APP,且沒有啟動APP
這里需要用到一次啟動多個Activity的知識,這里可以直接使用startActivities來啟動多個Activity
Intent intentLauncher = new Intent(context, MainActivity.class);//APP首頁
Intent intentDetails = new Intent(context, DetailsActivity.class);//文章詳情頁
Intent[] intents = new Intent[2];
intents[0] = intentLauncher;
intents[1] = intentDetails;
PendingIntent mPendingIntent = PendingIntent.getActivities(context, 0, intents, 0);
mPendingIntent.send();//這里同時啟動2個頁面,把首頁放到堆疊底,最終只顯示文章詳情頁
最終整合判斷條件代碼如下:
if(isFromBrowser){//判斷從瀏覽器喚醒APP
if(isLaunchedActivity(context, MainActivity.class)){//判斷是否已經啟動過APP(APP是否存在后臺)
Intent intent = new Intent(context, ArticleContentActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//加上Intent.FLAG_ACTIVITY_NEW_TASK的Flag,不然就在瀏覽器所在的堆疊里面了
startActivity(intent);
}else{
Intent intentLauncher = new Intent(context, MainActivity.class);//APP首頁
Intent intentDetails = new Intent(context, DetailsActivity.class);//文章詳情頁
Intent[] intents = new Intent[2];
intents[0] = intentLauncher;
intents[1] = intentDetails;
PendingIntent mPendingIntent = PendingIntent.getActivities(context, 0, intents, 0);
mPendingIntent.send();//這里同時啟動2個頁面,把首頁放到堆疊底,最終只顯示文章詳情頁
}
}else{
//TODO 如果是正常啟動(不是從瀏覽器跳轉,執行自己的邏輯)
}
總結:
本次實作此功能,也是折騰了我好一段時間,主要是對啟動頁面的邏輯思路沒有整理清晰,其次對startActivities理解不熟悉,故做此記錄以便后查
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/250707.html
標籤:其他
上一篇:Aosp10內核原始碼下載
下一篇:安卓開發學習——day8
