我最近刚刚添加了我的应用程序的功能,以检查本地服务器上的更新(此应用程序未在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键,我将会出现在设备的桌面上。
最佳答案
您的问题中有两个问题:
首先,为什么您的BroadcastReceiver
需要很长时间才能开始您的活动。
它没有足够的信息来存储此信息。
您想使活动具有单个实例的第二个实例。
Android提供了一种方法:
第一步:访问您的应用程序androidmanifest
文件
第二步:查找您的活动声明。
到那儿:添加以下属性android:launchMode = "singleInstance"
The reference here:
P / s:如果您能提供我更多有关拳头问题的信息。请创建一个新问题。希望您能解决。