Android Studio 开启其他app 通过包名和类名开启app 显式意图开启app,启动其他app 启动第三方app 方式二

之前发布关于此话题的文字使用了包名来启动另一个app的文章,发现了很多问题,竟然说空指针,对于我这种c语言半吊子的来说,指针?嘛指针,为啥我要指着针?

所以呢,这一篇文章把这解决过程和我所理解的流程记录下来。

既然咯,这种只用包名来启动app的方法我不配用(毕竟,我从学了一半java,就开始做app,钻这个牛角尖钻了两天还没有解决。)那我就用包名加activity方式来启动就是咯因为、这个方法绝对没问题。。。吧。

当然也是用Intent,Intent是什么呢,我的理解像是一种传递信息的车车🚗,在里面装载货物(数据)然后用startactivity作为钥匙来启动(Intent具体可以看看这篇文章)。

知道包名和activity,那怎么要用Intent来实现功能就是重中之重了。

因为是显式意图,首先需要给intent传递action和category,然后还要有componentName来确定目标app的包名和主界面接入口。

 Intent intent = new Intent(Intent.ACTION_MAIN);
 intent.addCategory(Intent.CATEGORY_LAUNCHER);

其中两个传递的参数分别是目标app的AndroidManifest.xml中主activity的intent filter,为啥会有这两个呢?

action 是可以说明这个activity是app的主入口

category 的话,对我来说就是这app的图标会不会呈现在手机页面上,能安装,但是不能直接启动,我突然就有了一个想法😁。

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"

        android:theme="@style/Theme.Template02">
        <activity android:name=".MainActivity2"></activity>
        <activity
            android:name=".MainActivity"

            android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />       
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

意思就像是这样,为啥在程序里不是和清单文件一样呢,启动用Ctrl+鼠标左键可得知,其实安卓大大已经替我们想好了呢~

所以,这是真的很不戳,真不戳。

action和category码好了,就要用componentName来确定目标的包名和主入口了,弄完之后就启动他就大功告成了。

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new  ComponentName("com.qiujie.myapplication","MainActivity");          
intent.setComponent(cn);
startActivity(intent);

欧克,启动之后,我发现,🐕☀🚗,,,闪退,怎么可能呢?随即甩手看日志喵(logcat)

2021-08-24 13:17:20.022 30120-30120/com.qiujie.template02 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.qiujie.template02, PID: 30120
    android.content.ActivityNotFoundException: Unable to find explicit activity class {com.qiujie.myapplication/MainActivity}; have you declared this activity in your AndroidManifest.xml?
        at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2065)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1727)
        at android.app.Activity.startActivityForResult(Activity.java:5427)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)
        at android.app.Activity.startActivityForResult(Activity.java:5385)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663)
        at android.app.Activity.startActivity(Activity.java:5771)
        at android.app.Activity.startActivity(Activity.java:5724)
        at com.qiujie.template02.MainActivity$1.onClick(MainActivity.java:44)
        at android.view.View.performClick(View.java:7505)
        at android.view.View.performClickInternal(View.java:7477)
        at android.view.View.access$3600(View.java:824)
        at android.view.View$PerformClick.run(View.java:28657)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:257)
        at android.app.ActivityThread.main(ActivityThread.java:8172)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1031)

什么?找不到主入口,说我没有声明这个活到,你他mua的。

经过不懈努力的(Ctrl+mouse1)我依旧不知道怎么办,这年头,为啥我连这函数的参数都看不到,,,

public final class ComponentName implements Parcelable, Cloneable, Comparable<ComponentName> {
    @NonNull
    public static final Creator<ComponentName> CREATOR = null;

    public ComponentName(@NonNull String pkg, @NonNull String cls) {
        throw new RuntimeException("Stub!");
    }

    public ComponentName(@NonNull Context pkg, @NonNull String cls) {
        throw new RuntimeException("Stub!");
    }

    public ComponentName(@NonNull Context pkg, @NonNull Class<?> cls) {
        throw new RuntimeException("Stub!");
    }

    public ComponentName(Parcel in) {
        throw new RuntimeException("Stub!");
    }

    @NonNull
    public static ComponentName createRelative(@NonNull String pkg, @NonNull String cls) {
        throw new RuntimeException("Stub!");
    }

stub????第一映像如下图 

算了万事问度娘,借助这篇文章得知,ComponentName有两个参数,第一个是要包名称,第二个是activity的全称,这也就是需要有路径的所以就更改为 

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new  ComponentName("com.qiujie.myapplication","com.qiujie.myapplication.MainActivity");          
intent.setComponent(cn);
startActivity(intent);

欧克,完美解决,可以跳转到目标app的界面了,可是,,,这好像不是我所想要的那种样子,因为这个是在这个app中,展现另一个app的界面,在后台管理中也没目标app,就是在这个app中打开了目标app的界面,,,我想的是打开app呀,,,不是画面呀,虽然功能都有,,,只不过倒是解决了 ,但没有完全解决。

 PS:我这里有了两个大胆的想法,敬请期待哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值