3

非公開の 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" />
4

3 に答える 3

7

残念ながら、プロセスが再インストールされたときにプロセスが終了するのを防ぐことはできません。一方で、その時点で再インストールされた独自のアプリの場合 、ブロードキャストを受信することはありません。

そのような機能を実装する必要がある場合、次のように問題を解決します。

トリック番号 1:

別のアプリ (ユーザーのデバイスにも何らかの方法でインストールされる) を作成することは、一種の「番犬」のように振る舞うことです: このアプリはインストール ブロードキャストをリッスンします。インストール済み - 「元のアプリ」の起動に問題はありません。

もちろん、ユーザーがこのウォッチドッグ アプリを少なくとも 1 つ「起動」する必要があることを忘れないでください。これは、アプリ プロセスが少なくとも 1 つから開始されるまで、Android 4 レシーバーが機能しないためです。それはセキュリティ上の理由です..

トリック番号 2:

別のオプションは、アプリをマニフェストに登録してACTION_TIME_TICKブロードキャストすることです。このブロードキャストが秒数ごとに呼び出されることを期待し、アプリが現在メイン アクティビティを起動する必要があるかどうかを認識する何らかのロジックを受信したときに実装できます。

このアプローチは機能しますが、パフォーマンスの理由から、アプリのプロセスはそのブロードキャストに反応するため、ほぼ常にアクティブであるため、それほど良くありません。あなたがそれを気にしなければ-それで問題ありません

トリック番号 3:

インストール作業を開始する直前に 30 ~ 50 秒後に提供pendingIntentします。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 に答える