【问题标题】:Prevent app from running on two instances阻止应用在两个实例上运行
【发布时间】:2023-12-27 10:22:01
【问题描述】:

我最近刚刚在我的应用程序中添加了检查本地服务器上的更新的功能(此应用程序未在 Google Play 商店中发布。它将在内部使用,并且没有使用它的互联网连接。不要问。就是这样:))。我通过检查 SQL Server 中的某个表来跟踪更新,如果我的应用程序版本低于此表中指示的版本,我会从内部网站(仅限 LAN)下载新的 APK,然后安装 APK。我在设备中还有另一个应用程序可以监听 PACKAGE_ADDED 广播。我可以成功捕获广播。

问题是,安装后,广播接收器通过调用以下命令启动应用程序。

public class PackageInstalledBroadcastReceiver extends BroadcastReceiver {
private final String MY_PACKAGE_NAME = "com.company.packagename";

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
        String packageName = intent.getData().getSchemeSpecificPart();
        if (packageName.equalsIgnoreCase(MY_PACKAGE_NAME)) {                                
            Intent i = new Intent();
            i.setClassName(MY_PACKAGE_NAME, MY_PACKAGE_NAME + ".LoginActivity");
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }
}

}

但是应用启动需要很长时间。用户可能认为什么都没有发生,因此他/她可以通过单击应用程序的图标来手动启动应用程序。如果用户单击应用程序的图标,应用程序会立即启动。过了一会儿,广播接收器启动的活动也打开了。所以现在,我在同一个活动(LoginActivity)中得到了我的应用程序的两个实例。我可以说是这样,因为如果我从 LoginActivity 按设备上的返回键,我仍然会进入另一个 LoginActivity,如果我再次按返回键,我最终会出现在设备的桌面上。

【问题讨论】:

  • 如果你广播意图打开你的应用程序 LoginActivity 那么你实际上是在打开或者你需要点击应用程序图标来打开应用程序。
  • Activity实际打开了,安装更新后打开大概需要15秒
  • 您是否也尝试过其他设备
  • 我在另一台设备上试过了,安装完成后应用就打开了。可能是其他设备的问题

标签: java android android-activity broadcastreceiver


【解决方案1】:

你的问题有两个问题:

拳头,为什么你的BroadcastReceiver 需要很长时间才能开始活动。

它没有足够的信息来烘烤这个。

第二个你想让你的活动有一个实例。

Android 提供了一种方法来做到这一点:

  • 第一步:访问您的应用程序androidmanifest 文件
  • 第二步:找到您的活动声明。
  • 步骤:添加以下属性android:launchMode = "singleInstance"

The reference here:

P/s:如果你能提供更多关于你的拳头问题的信息。请创建一个新问题。希望你能解决。

【讨论】:

  • 对第二个问题的建议没有正常工作。如果用户仍在 LoginActivity 中,则不会打开 LoginActivity。但是如果用户已经登录,他/她将在MainActivity中,由于不再有LoginActivity的实例,正在创建一个新的实例。
最近更新 更多