【问题标题】:update My App Issue更新我的应用问题
【发布时间】:2014-09-03 20:26:41
【问题描述】:

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

【问题讨论】:

  • 无论何时安装一个 apk,如果该应用程序的先前版本存在,它将完全停止特别是它可以升级。我自己没有尝试过,但也许this 可以帮助您重新启动您的应用。
  • 这与我在评论中链接到的问题完全相同。
  • 是的,但它不起作用....还有其他建议吗? @A--C

标签: android android-intent broadcastreceiver


【解决方案1】:

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

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

技巧 1:

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

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

技巧 2:

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

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

技巧 3:

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

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

【讨论】:

  • 谢谢@Tal Kanel,但我已经完成了这个补丁,它工作正常,但我想从我的应用程序重新打开它。
  • @KaranMavadhiya:我提供的第二个选项呢?
  • 安装不需要在 30-50 秒内完成,所以技巧 3 毫无价值..
【解决方案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);

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多