<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # 使用Intent打開第三方應用的方式 ## 通過包名打開 **必要條件** 需要第三方應用配置有默認的入口Activity。 **打開方式** ```java Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.mmbox.xbrowser.pro"); startActivity(intent); ``` 當目標應用不存在或沒有默認的入口Activity時,會報如下錯誤: ```plain Attempt to invoke virtual method 'java.lang.String android.content.Intent.toString()' on a null object reference ``` 因此啟動三方應用前應進行非空判斷: ```java Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.mmbox.xbrowser.pro"); if (intent == null) { Toast.makeText(context, "找不到該應用", Toast.LENGTH_SHORT).show(); } else { startActivity(intent); } ``` ## 通過包名和Activity打開 **必要條件** 1、需要知道三方應用的包名和Activity名 2、三方應用清單文件中,目標Activity的屬性`Export`需配置為`true` **打開方式** ```java Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ComponentName componentName = new ComponentName("com.mmbox.xbrowser.pro", "com.mmbox.xbrowser.BrowserActivity"); intent.setComponent(componentName); startActivity(intent); ``` 當目標應用不存在、目標Activity不存在、目標Activity未被設置為`Exported=true`時,會報如下錯誤: ```plain android.content.ActivityNotFoundException: Unable to find explicit activity class {xx.xx.xx/xx.xx.xxActivity}; have you declared this activity in your AndroidManifest.xml? ``` 因此啟動前需進行判斷: ```java Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ComponentName componentName = new ComponentName("com.mmbox.xbrowsesr.pro", "com.mmbox.xbrowser.BrowserActivity"); intent.setComponent(componentName); if (intent.resolveActivityInfo(getPackageManager(), PackageManager.MATCH_DEFAULT_ONLY) != null) { startActivity(intent); } else { Toast.makeText(context, "找不到應用", Toast.LENGTH_SHORT).show(); } ``` 此處不能使用Intent.resolveActivty方法判斷,具體可參考后面的源碼部分。 ## 隱式啟動 **必要條件** 1、IntentFilter中至少有一個action,至少有一個Category,可沒有Data和Type 2、如果有Data,參數中Data必須符合Data規則 3、Action和Category必須同時匹配Activity中的一個Action和一個Category **打開方式** ```java Uri uri = Uri.parse("http://www.baidu.com"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); ``` 啟動前需進行判斷: ```java Uri uri = Uri.parse("http://www.baidu.com"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { Toast.makeText(context, "找不到應用", Toast.LENGTH_SHORT).show(); } ``` ## 源碼分析 Intent的resolveActivity方法源碼如下: ```java public ComponentName resolveActivity(@NonNull PackageManager pm) { if (mComponent != null) { return mComponent; } ResolveInfo info = pm.resolveActivity(this, PackageManager.MATCH_DEFAULT_ONLY); if (info != null) { return new ComponentName( info.activityInfo.applicationInfo.packageName, info.activityInfo.name); } return null; } ``` Intent的resolveActivityInfo方法源碼如下: ```java public ActivityInfo resolveActivityInfo(PackageManager pm, @PackageManager.ComponentInfoFlags int flags) { ActivityInfo ai = null; if (mComponent != null) { ai = pm.getActivityInfo(mComponent, flags); } else { ResolveInfo info = pm.resolveActivity(this, PackageManager.MATCH_DEFAULT_ONLY | flags); if (info != null) { ai = info.activityInfo; } } return ai; } ``` resolveActivity和resolveActivityInfo兩個方法名稱相似,但是返回值卻是不同的。前者返回的是ComponentName,后者返回的是ActivityInfo。在打開三方應用指定Activity時,需使用resolveActivityInfo方法進行判斷。 # 總結 1、使用PackageManager.getLaunchIntentForPackage方法時,直接判斷返回的Intent是否為空即可 2、使用Intent.setComponent方法時,需使用`Intent.resolveActivityInfo()`或者`packageManager.queryIntentActivities()`兩種方式判斷 3、隱式啟動時,使用`Intent.resolveActivity()`、`Intent.resolveActivityInfo()`、`packageManager.queryIntentActivities()`三種方式均可 參考文檔:[https://likfe.com/2017/08/30/android-is-intent-available/](https://likfe.com/2017/08/30/android-is-intent-available/)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看