app 启动第三方应用

方式一:

知道包名和要启动界面的全路径;(清单文件Activity配置中android:name所声明的全路径,同时该界面必须是 export = true)

 Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        ComponentName cn = new ComponentName("com.jingdong.app.mall",
                "com.jingdong.app.mall.main.MainActivity");
        intent.setComponent(cn);
        if (intent.resolveActivityInfo(getPackageManager(), PackageManager.MATCH_DEFAULT_ONLY) != null) {//启动的intent存在
            startActivity(intent);
        } else {

        }

知道包名(启动默认的启动界面):

Intent intent = getPackageManager().getLaunchIntentForPackage("com.pull.csd");
                if (intent != null) {
                    intent.putExtra("type", "110");
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }

方式二:

通过在要启动的界面下增加某个intent-filter,然后启动;

第一种:ACTION字符串:

Intent intent = new Intent();
                intent.setAction("CSD");
                intent.putExtra("type", "110");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);

第二种:ACTION字符串+包名+启动页所在项目位置

ComponentName componentName = new ComponentName("com.pull.csd", "com.pull.csd.SplashActivity");
                Intent intent = new Intent();
                intent.setAction("CSD");
                intent.setComponent(componentName);
                intent.putExtra("type", "110");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);

在被启动的界面上加一个intent-filter

<intent-filter>
                <action android:name="CSD" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

方式三:

通过浏览器打开某个应用

A应用启动B,则A中代码为

Intent intent = new Intent();
                intent.setData(Uri.parse("csd://pull.csd.demo/cyn?type=110"));
                intent.putExtra("", "");//这里Intent当然也可传递参数,但是一般情况下都会放到上面的URL中进行传递
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);

B中的代码解析数据代码为:

 private void parseData() {
        Intent intent = getIntent();
        if (intent != null) {
            String intentAction = intent.getAction();
            if (Intent.ACTION_VIEW.equals(intentAction)) {
                Uri intentData = intent.getData();
                String name = intentData.getQueryParameter("name");
                Log.e(TAG, "initIntentData: " + name);

            }
        }
    }

B中的mainfest.xml 中添加 ,url 启动第三方app,不需要添加 export = true,这个条件。

 <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

                <data
                    android:host="my_host"
                    android:scheme="jump"/>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>


或则

 <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                
            </intent-filter>

            <intent-filter>

                <data
                    android:host="my_host"
                    android:scheme="jump"/>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <category android:name="android.intent.category.DEFAULT"/>

            </intent-filter>
        </activity>

针对B 应用app的某个被启动的界面需要依赖前面界面传递的数据或者前面界面的逻辑情况,这个比较复杂,后面再去考虑?


参考文章:

安卓开发由一个APP拉起另一个APP的方法总结 :https://blog.csdn.net/zang_chen/article/details/76677846 (比较详细)

通过URL启动另一个app: https://www.jianshu.com/p/7d90a6cfb5f3

猜你喜欢

转载自blog.csdn.net/sjh_389510506/article/details/88061741