web-dev-qa-db-ja.com

最近のアプリがアプリのメモリを消去し、受信機が動作しなくなった

MyAppのReceiverは、バックグラウンドで次の場合に正常に機能します。

    public class MySmsReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("triggered sms");
        if(intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
          Toast.makeText(context, "message Received", Toast.LENGHT_SHORT).show();
    }
}

そして、レシーバーの私のマニフェストファイルは

        <receiver Android:name=".MySmsReceiver">
        <intent-filter>
            <action Android:name="Android.provider.Telephony.SMS_RECEIVED" />

        </intent-filter>
    </receiver>

マニフェストファイルでレシーバーを宣言すると、常に機能するはずだとドキュメントに記載されています。しかし、私の場合はそうではありません...

しかし、最近のアプリをスワイプしてクリアすると、機能しなくなりました。そして、私がタスクマネージャに行って、MyApps forcestopが以下のように無効になっているのを見ました screenshot of my app in taskmanager

watsappやfbのようないくつかのアプリが常にメモリに保存されていることがわかりました。最近の明確なアプリをスワイプした後もこのbcozを言っています

fb state in task manager

および watsapp state in taskmanager

どうすればアプリにこれを行うことができますか?アプリがwatsppやfacebookなどの他のサードパーティアプリのように動作するようになった理由...アプリを常にメモリに保存するにはどうすればいいですか? ..私が間違っている場合、これを行うための解決策を教えてください...

私はこれを頻繁に検索しましたが、解決策が見つかりません...間違っていますか?または本当にそれを行う方法はありますか?誰かが私を助けてください...これは私を一週間にします!!!私はあなたに私がすぐに応答を提供します私に尋ねていない場合、ここで私の問題を説明したいと思います。

25
Mr.Popular

一部のHuaweiデバイス(および一部のLGおよびXiaomiデバイス)では、バックグラウンドで実行を許可されているアプリのリストにアプリを追加する必要があります。 (最近のタスクリストからスワイプするか、Androidリソースの理由でアプリを強制終了する)で)停止すると、自動的に再起動しません。

Huaweiデバイスでは、設定は「保護されたアプリ」と呼ばれます。プログラムで「保護されたアプリ」のリストにアプリを追加することはできません。アプリをインストールした後、ユーザーがそれを行う必要があることをユーザーに伝える必要があります。有名なアプリ(Whatsapp、Facebook、Google Mailなど)は、メーカーによって自動的に追加されます。

この動作は異なるデバイスで異なる場合があり、Androidの異なるバージョンで異なる場合があります。また、デバイスが特定の携帯電話事業者向けにブランド化されている場合は、携帯電話事業者がまた、設定自体をいじくり回します。

詳細については、Huaweiスマートフォンの 「保護されたアプリ」の設定とその処理方法 をご覧ください。

編集:これを追加:

また、Android= Android 4.4(KitKat)の「最近からのスワイプ」動作を中断したため、スワイプされたアプリで問題が発生します。遅らせられず、ブロードキャストIntentsは配信されません。それに対処するための回避策についての情報があります。 In Android 4.4、スワイプアプリを最近からスワイプするタスクはそのサービスでアプリケーションを永久に停止します。理由は何ですか?

また、Google Playストアからアプリをインストールしましたか? Playストアからインストールされたアプリと、ローカルにインストールされたアプリ(ダウンロードまたはadbなど)でインストールされたアプリでは、動作が異なる可能性があります。

19
David Wasser

このシナリオはいくつかのデバイスで発生するようです(例:Xiaomi、Honorデバイス、SmartManager機能を備えたSamsungデバイスなど)ユーザーが削除するとアプリケーションが強制停止される最近のタスクからアプリ。

これは、これらのメーカーがメモリ/バッテリー管理のためにアプリを強制的に停止するタスクマネージャー機能をデフォルトで追加したためです。しかし、WhatsappやFacebookなどのアプリケーションはほとんど動作しません。これは、彼らが最も有名なアプリケーションをホワイトリストに登録したからかもしれません。

Android開発者向けドキュメント/ UXの推奨事項、このシナリオで考えられる回避策、

ケースXiaomi MIUIベースのデバイス:

ユーザーと通信するUXを作成して、アプリの「AutoStart」権限を有効にします。基本的にユーザーは「セキュリティ」アプリを開く必要があります->「許可」をクリック->「自動起動」をクリック->アプリを探して有効にします。私はそのとんでもない苦痛を知っていますが、他の簡単なオプションはありません。

メーカーがXiaomiかどうかを確認した後、上記を行います

String manufacturer = "xiaomi";
        if(manufacturer.equalsIgnoreCase(Android.os.Build.MANUFACTURER)) {
            //this will open auto start screen where user can enable permission for your app
            Intent intent = new Intent();
            intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
            startActivity(intent);
        }

注:この手順は、Honorデバイス、Samsungデバイスではメーカー固有のものであるため、異なる場合があります。

また、これを他のデバイスで解決する通常の方法として、onTaskRemovedメソッドをオーバーライドしてスティッキーサービスを作成することです。以下のコードを使用します。

public class BackgroundService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        //create a intent that you want to start again..
        Intent intent = new Intent(getApplicationContext(), BackgroundService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent);
        super.onTaskRemoved(rootIntent);
    }
}

ここでは、5秒後にサービスが再び開始されます。最近のアプリから削除された後、再起動したい意図に置き換えることができます。

16
Govind

[強制停止]ボタンが無効になっている場合、[概要]でアプリをスワイプすると、このデバイスでアプリが強制停止されます。ユーザーがアプリを再度操作するまで、ブロードキャストを受信しません。

0
Steve M