更新我的App问题

时间:2013-08-10 05:43:52

标签: android android-intent broadcastreceiver

我正在开发一款非公开的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" />

3 个答案:

答案 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)