3

我正在开发一个非公开的 Android 应用程序,即该应用程序将不会在全球 Android 市场上提供。该应用程序将安装在有限数量的客户端上,例如通过使用 apk 文件。我在 SD 卡中有一个 .apk,我正在尝试从我的应用程序更新我的应用程序。为此,我正在使用 Intent

我的代码

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" />
4

3 回答 3

7

不幸的是,您无法阻止进程在重新安装时被终止,另一方面 -如果当时重新安装了您自己的应用程序, 您将永远不会收到任何广播。

如果我必须实现这样的功能,我会解决这样的问题:

技巧一:

创建另一个应用程序(它也会以某种方式安装在您的用户设备上)它只是运行就像一个“看门狗”:这个应用程序会收听安装广播,因为它是不同的应用程序然后是那个已安装 - 启动到“原始应用程序”不会有问题。

当然不要忘记用户将需要“启动”至少一个这个看门狗应用程序,因为从 android 4 接收器将无法工作,直到应用程序进程开始至少一个。那是出于安全原因..

技巧2:

另一种选择是在清单中注册您的应用程序也进行ACTION_TIME_TICK广播。你可以指望这个广播每秒钟被调用一次,并在它接收到一些逻辑时实现,该逻辑识别应用程序现在是否需要启动主要活动。

这种方法会起作用,但从性能的角度来看,原因并不是那么好——因为您的应用程序进程几乎一直处于活动状态,因为它会对广播做出反应。如果你不关心那个 - 所以没问题

技巧3:

在您开始安装活动之前提供pendingIntent到30-50 秒后。alarmManager待定意图将保留重新启动您的应用程序的意图。

假设该应用程序将在此之前安装 - 它会工作。

于 2013-08-13T06:05:43.277 回答
2

接受的答案不正确。

您可以简单地将 FLAG_ACTIVITY_NEW_TASK 添加到启动安装程序的意图中。这样,安装程序将在单独的进程上运行,并且在用新版本替换软件包后不会被杀死。

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);
于 2014-09-03T12:26:41.753 回答
1

尝试使用 android.intent.action.MY_PACKAGE_REPLACED

http://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED

于 2013-08-19T05:57:17.930 回答