阻止应用在两个实例

时间:2015-10-24 02:19:04

标签: java android android-activity broadcastreceiver

我最近添加了我的应用程序的功能,以检查我们本地服务器上的更新(此应用程序未在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按下设备上的Back键,我仍然会在另一个LoginActivity中结束,如果我再次按Back键,我最终会进入设备的桌面

1 个答案:

答案 0 :(得分:0)

你的问题有两个问题:

首先,为什么BroadcastReceiver需要很长时间才能开始您的活动。

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

您希望活动的第二个实例只有一个。

Android提供了一种方法:

  • 第一步:访问您的申请androidmanifest档案
  • 第二步:找到您的活动声明。
  • 单步执行:添加以下属性android:launchMode = "singleInstance"

The reference here:

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