在第三方浏览器中打开本地app某个activity 使得app多次启动的解决办法

本文介绍了一种防止第三方浏览器重复启动同一本地App的方法。通过调整Activity的启动模式为singleTask,并在启动时检查该Activity是否已处于运行状态,从而避免了多次启动导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目开发中,遇到了一个问题,通过第三方浏览器打开本地app的解决办法;

我们一般都是通过

<intent-filter>
    //这三方必须配置
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data android:scheme="caifuapp" />
</intent-filter>
配置来启动,但是url启动与在手机桌面启动是打开了多个app,在手机上并不支持一个应用打开多次的情况所以会出现多次重启的情况

解决办法如下:

把主界面的启动模式改为singtask,把启动的activity的启动模式也改成singtask。

配置启动界面的scheme值

在启动界面判断主界面是否已经启动,假如已经启动直接跳过广告界面到达主界面启动需要展示的页面

如果没有,则启动广告业

    protected void startAndExit(Intent i) {
        Intent intent = new Intent(this, HomepageActivity.class);
        if (i != null) {
            intent.setData(i.getData());
        }
        ComponentName cmpName = intent.resolveActivity(getPackageManager());
        boolean bIsExist = false;
        if (cmpName != null) { // 说明系统中存在这个activity
            ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
            List<ActivityManager.RunningTaskInfo> taskInfoList = am.getRunningTasks(10);
//            logi(TAG, "---startAndExit---taskInfoList.size:" + taskInfoList.size());
            for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {

                if (taskInfo.baseActivity.equals(cmpName)) { // 说明它已经启动了
                    bIsExist = true;
                    break;
                }
            }
        }

        if (bIsExist) {
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//            intent.putExtra("isExit", (Boolean) true); //让它自行关闭
            this.startActivity(intent);
        } else {
            Intent intent1 = new Intent(SplashActivity.this, StartActivity.class);
            if (i != null) {
                intent1.setData(i.getData());
            }
            startActivity(intent1);
        }
    }
如果某个Activity的运行模式被设置为singleTask或singleInstance,再次启动它,会触发它的onNewIntent方法。


@Override
protected void onNewIntent(Intent intent) {
    startAndExit(intent);

    finish();
    super.onNewIntent(intent);

}

@Override  
protected void onNewIntent(Intent intent) {  
    logi(TAG, "---onNewIntent---");  
    super.onNewIntent(intent);  
    if (intent.getBooleanExtra("isExit", false)) {  
        finish(); // 自行关闭  
    }  
}  





也不一定只有这一种解决版,如有更好的方法,希望大家告知,努力吧,程序员;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值