之前发布关于此话题的文字使用了包名来启动另一个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:我这里有了两个大胆的想法,敬请期待哦