我正在开发一款非公开的Android应用,即该应用将无法在全球Android电子市场上推出。该应用程序将安装在有限数量的客户端上,例如通过使用apk文件。我在SD卡中有一个.apk,我正在尝试从我的应用程序更新我的应用程序。为此,我正在使用意图
我的代码
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath()+"/" +"Test.apk")), "application/vnd.android.package-archive");
startActivity(intent);
注意:工作正常,但在更新后,应用程序将会关闭。
问题是“如何防止这种情况?”
我也使用广播接收器重新打开我的应用
public class AutoStart extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
Intent i = new Intent(context, ABCActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}else{
Intent i = new Intent(context, XYZActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
问题 1: -
时无法重新打开活动“android.intent.action.PACKAGE_ADDED”,
“android.intent.action.PACKAGE_INSTALL”,
“android.intent.action.PACKAGE_CHANGED”
<receiver
android:name=".AutoStart"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="100" >
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<data android:scheme="package" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_INSTALL" />
<data android:scheme="package" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_CHANGED" />
<data android:scheme="package" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
“android.intent.action.BOOT_COMPLETED”正常工作
权限
1 > <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
2 > <uses-permission android:name="android.permission.RESTART_PACKAGES" />
3 > <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
答案 0 :(得分:7)
遗憾的是,您无法阻止进程在重新安装时终止,另一方面 - 如果您自己的应用已经重新安装,您将永远不会收到任何广播那时候。
如果我必须实现这样的功能,我会解决这个问题:
技巧1:
创建另一个应用程序(也会以某种方式安装在用户的设备上),它只会像“看门狗”一样:这个应用程序会监听安装广播,因为它是不同的应用程序然后已安装的人 - 启动“原始应用程序”没有问题。
当然不要忘记用户将需要“启动”至少这个看门狗应用程序,因为从Android 4接收器将无法工作,直到应用程序进程至少开始。这是出于安全原因......
技巧2:
另一种选择是在你的应用程序中注册ACTION_TIME_TICK
广播。你可以指望这个广播被调用每个秒数,并在它收到一些逻辑时实现,这些逻辑识别现在的应用程序是否需要启动主要活动。
这种方法会起作用,但是从表演的原因来看并不是那么好 - 因为你的应用程序流程几乎一直都会活着,因为它会对那个广播作出反应。如果你不在乎 - 所以这不是问题
技巧3:
在您开始安装活动之前将pendingIntent
提供给alarmManager
至30-50秒之后。待处理的意图将有意重新启动您的应用程序。
假设应用程序将安装到那时 - 它会工作。
答案 1 :(得分:2)
接受的答案不正确。
您可以简单地将FLAG_ACTIVITY_NEW_TASK添加到intent,从而启动安装程序。这样安装程序将在一个单独的进程上运行,并且在用新版本替换软件包后不会被终止。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath()+"/" +"Test.apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
答案 2 :(得分:1)
尝试使用android.intent.action.MY_PACKAGE_REPLACED
http://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED