Android10 Launcher启动第三方应用,重复打开Activity问题

  1. 自己开发Launcher,一直是预制应用,直接点击Launcher 上的Icon,没发现问题。
  2. 如果install 应用的话,问题就会出现。
    首先被启动的应用首页不能设置 android:launchMode=“singleTask”,如果设置了则每次打开的是首页
    打开应用的方式是:
public void startActiv(String pkg,String cls){
		ComponentName componet = new ComponentName(pkg, cls);
		Intent intent = new Intent();
		intent.setComponent(componet);
		 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
		startActivity(intent);
	}

出现的问题:
install 上应用后,从MainActivity -->startActivity -->SeconActivity 页面
然后Home键,再次点击Launcher上的 Icon 进入此应用,进入后发现不是在SecondActivity 页面,而又是在MainActivity 页面上,打log看,home键退出后,重新进入,都会走onCreate 函数。
使用banck键退出后,第二次进入,就好了,不会重新创建应用了。

解决办法:
1.如果是自己开发的app,可以在应用里面添加:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //添加
       if (!isTaskRoot()) {
            finish();
            return;
        }
        setContentView(R.layout.activity_main);
  1. 如果你是要启动第三方应用,则使用此方法即可:
/**
	 * 启动第三方apk
	 * 
	 * 如果已经启动apk,则直接将apk从后台调到前台运行(类似home键之后再点击apk图标启动),如果未启动apk,则重新启动
	 */
public  void OpenIntentByPackageName( String packageName, String mainAct){
	    Intent intent = new Intent(Intent.ACTION_MAIN);
	    intent.addCategory(Intent.CATEGORY_LAUNCHER);
	    intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED|Intent.FLAG_ACTIVITY_NEW_TASK);
	    intent.setComponent(new ComponentName(packageName, mainAct));
	    startActivity(intent);

	}

或者

/**
 * 启动第三方apk
 * 
 * 如果已经启动apk,则直接将apk从后台调到前台运行(类似home键之后再点击apk图标启动),如果未启动apk,则重新启动
 */
public static void startActivityForApp() {
    Intent intent = getAppOpenIntent(ContextHolder.getContext(), PACKAGENAME_KEMOBILEVIDEO);
    ContextHolder.getContext().startActivity(intent);
}
 
public static Intent getAppOpenIntent(Context context, String packageName) {
    String mainAct = null;
    PackageManager pkgMag = context.getPackageManager();
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);
 
    @SuppressLint("WrongConstant") List<ResolveInfo> list = pkgMag.queryIntentActivities(intent,
            PackageManager.GET_ACTIVITIES);
    for (int i = 0; i < list.size(); i++) {
        ResolveInfo info = list.get(i);
        if (info.activityInfo.packageName.equals(packageName)) {
            mainAct = info.activityInfo.name;
            break;
        }
    }
    if (TextUtils.isEmpty(mainAct)) {
        return null;
    }
    intent.setComponent(new ComponentName(packageName, mainAct));
    return intent;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对不起,我无法提供图形化的内容,因为我只能处理文本。但是我可以通过文字来描述一个Activity启动时序图。 当一个Activity启动时,以下是它的大致时序图: 1. 用户点击应用程序的图标或从其他应用程序中启动Activity。 2. 系统在操作系统级别接收到启动Activity的请求。 3. 系统启动应用程序进程(如果尚未运行)。 4. 应用程序进程被创建并加载到内存中。 5. 应用程序进程启动主线程。 6. 主线程初始化应用程序的资源和UI组件。 7. 主线程调用Activity的生命周期方法(onCreate)。 8. Activity的布局被加载到屏幕上,并显示给用户。 9. 如果有必要,主线程会执行其他初始化操作,如加载数据或设置事件监听器。 10. Activity的生命周期方法(onStart、onResume)被调用,Activity变为可见状态并开始响应用户交互。 11. 用户与Activity进行交互,可能触发一些事件或操作。 12. 如果用户执行了某些操作(如点击按钮),主线程会调用Activity的相应事件处理方法(如onClick)。 13. Activity根据用户的操作作出相应的响应,可能涉及到更新UI、执行业务逻辑等操作。 14. 用户继续与Activity进行交互,重复步骤11-13。 15. 当用户离开当前Activity(如按下返回按钮)或其他情况导致Activity不再可见时,Activity的生命周期方法(onPause、onStop)会被调用。 16. 如果Activity被销毁(如用户切换到其他应用程序),主线程会调用Activity的生命周期方法(onDestroy)。 17. 应用程序进程可能在后台继续运行,直到系统需要释放资源时才会被终止。 这是一个简化的时序图,仅描述了Activity启动和基本生命周期方法的调用,实际情况可能会更加复杂。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FW_G8Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值