web-dev-qa-db-ja.com

Android-Xiaomiデバイスでプログラムによって自動起動オプションを有効にする方法?

プッシュ通知を表示したいAndroidアプリケーションを開発しています。

Xiaomi電話(私はRedmi Note 4を使用しています)を除くほとんどのデバイスでうまく表示されています。私が見つけた問題は、Xiomiが提供するAutostartオプションがデフォルトで無効になっていて、ユーザーが手動で有効にする必要があるためです。

ただし、Androidアプリの一部は、ユーザーの操作なしでこのオプションを有効にすることができます。例:WhatsApp。WhatsAppを再インストールして自動起動オプションを表示すると、有効になっています。

上記の例のように問題なく動作しているアプリを指摘しているため、Xiomiのようなデバイスの機能であるとクライアントに納得させることができません。

この質問は他の人から尋ねられました

アプリをAndroidプログラムで)のAutoStartアプリリストに追加する

XiaomiメーカーのモバイルデバイスのプログラムでAutoStartがアプリで有効になっていることを確認する方法

しかし、私は彼らの答えを見ることができず、誰かがこれに対する答えを持っていることを期待してここに投稿しました。

10
Rakesh L

自動起動機能は、xiaomi OSがAmazon、google IOなどのアプリも自動起動を許可されていないため、この場合、セキュリティ権限->自動起動->から自動起動を有効にします。コードでアプリを自動起動することはできません。自動起動を有効にするダイアログを表示して、ユーザーを自動起動アクティビティに移動させることはできますが、これは自動起動が有効になっているかどうかを確認できないため、適切なオプションです。これはMIUI8のMiによってバッテリー節約のために行われます。この問題は2日間のXDを無駄にしました

この記事 を参照してください。

5
Rohit Sharma

Xiaomi、oppo、vivoなどのデバイスで、プログラムで自動起動オプションを有効にする

String manufacturer = Android.os.Build.MANUFACTURER;
try {
      Intent intent = new Intent();
      if ("xiaomi".equalsIgnoreCase(manufacturer)) {
                intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
      } else if ("oppo".equalsIgnoreCase(manufacturer)) {
                intent.setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity"));
      } else if ("vivo".equalsIgnoreCase(manufacturer)) {
                intent.setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity"));
      } else if ("Letv".equalsIgnoreCase(manufacturer)) {
                intent.setComponent(new ComponentName("com.letv.Android.letvsafe", "com.letv.Android.letvsafe.AutobootManageActivity"));
      } else if ("Honor".equalsIgnoreCase(manufacturer)) {
                intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity"));
      }

      List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
      if (list.size() > 0) {
                startActivity(intent);
      }

} catch (Exception e) {
      e.printStackTrace();
}
4
Harikesh

私の知る限り、WhatsAppはXiaomiデバイスの自動起動でホワイトリストに登録されています。それについてあなたができることは何もありません。もちろん、最終的にWhatsAppの人気を獲得した場合、Xiaomiによってアプリケーションがホワイトリストに登録されます。それが発生するまで、次のようなAuto-start機能を表示することによって、ユーザーに手動でアクティブ化するように要求することができます:

try {
  Intent intent = new Intent();
  if ("xiaomi".equalsIgnoreCase(Android.os.Build.MANUFACTURER)) {
    intent.setComponent(new ComponentName("com.miui.securitycenter", 
          "com.miui.permcenter.autostart.AutoStartManagementActivity"));
  }

  // context is your Context
  List<ResolveInfo> list = context.getPackageManager()
                                  .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

  if  (list.size() > 0) {
    context.startActivity(intent);
  } 

} catch (Exception e) {
  Log.d("PERMISSION", e.toString());
}

現在のXiaomiデバイスのコードはテストしていません。

メモリクリーンアップサイクル中に殺されることなくバックグラウンドで実行される人気のあるアプリはほとんどありません(人気のあるOEMの多くは、バッテリー/メモリの最適化のためにスタックROMをカスタマイズしています)。アプリの場合は、手動で(デバイスの対応する「設定」を使用して)、またはユーザーを対応する設定ページにリダイレクトしてアプリをホワイトリストに登録することにより、実際にホワイトリストに登録できます。実用的には以下のようにすることができます:

  1. アプリのマニフェストファイルに以下の権限を追加します: `

    <uses-permission Android:name="oppo.permission.OPPO_COMPONENT_SAFE"/> 
    <uses-permission Android:name="com.huawei.permission.external_app_settings.USE_COMPONENT"/>`
    
  2. 自動開始設定にリダイレクトします。

    if (Build.BRAND.equalsIgnoreCase("xiaomi")) {
                    Intent intent = new Intent();
                    intent.setComponent(new 
    
    ComponentName("com.miui.securitycenter",
                                "com.miui.permcenter.autostart.AutoStartManagementActivity"));
                        startActivity(intent);
                } else if (Build.MANUFACTURER.equalsIgnoreCase("oppo")) {
                    try {
                        Intent intent = new Intent();
                        intent.setClassName("com.coloros.safecenter",
                                "com.coloros.safecenter.permission.startup.StartupAppListActivity");
                        startActivity(intent);
                    } catch (Exception e) {
                        try {
                            Intent intent = new Intent();
                            intent.setClassName("com.oppo.safe",
                                    "com.oppo.safe.permission.startup.StartupAppListActivity");
                            startActivity(intent);
                        } catch (Exception ex) {
                            try {
                                Intent intent = new Intent();
                                intent.setClassName("com.coloros.safecenter",
                                        "com.coloros.safecenter.startupapp.StartupAppListActivity");
                                startActivity(intent);
                            } catch (Exception exx) {
    
                            }
                        }
                    }
                }
    

他のOEM向けのAutoStartリファレンス

私はこの方法をテストしましたが機能しましたが、システムが停止したサービスを再起動するのに時間がかかる(PoccoF9およびXiomiデバイスでは約2分)ため、信頼性は依然として問題です。

ただし、ユーザーとして、以下のようにアプリのバックグラウンドサービスがすべて強制終了されるのを防ぐことができます。

  1. 最近使ったアプリの物理キー(左側のボタン)を押します。
  2. アプリを1回下にドラッグ(選択して押し続け、下にスライド)して、ロックアイコンをタップし(ロックが開いた状態の場合)、アプリをロックします。
  3. アプリはロック状態になります(クリアしてバックグラウンドアプリプロセスをクリアした場合でも、アプリは実行を続けます)。
  4. 同様に、ロック状態から解除したい場合は、もう一度下にドラッグするだけでロック記号が消えます(バックグラウンドプロセスをクリアすると、アプリの実行もクリアされます)。

ただし、この方法では、ほとんどのデバイスで再起動時にアプリのロック状態がリセットされます。

EDIT: Foregroundサービスの動作(XiomiのRedmiS3、Android V6.0)を観察した後の分析は次のとおりです。

  1. プログラムで "AutoStart"を(上記で説明したように、ユーザーの介入により)有効にした後でも、サービスは常に再起動しませんでした(サービスは数回だけ再起動しましたが、ほとんどの場合再起動しませんでした)。
    また、デバイス設定で「AutoStart」を検索すると、AutoStartリストにアプリが表示されません。上記の方法は、自動起動の権限を提供するだけで有効にすることはできません。また、デバイス設定を介してアプリを「AutoStart」リストに追加すると、サービスが再起動します(多少時間がかかります)。

  2. OnTaskRemoved()コールバックで強制終了されたサービスを再起動することも別のオプションですが、このコールバックは、サービスが強制終了されたときに驚くべき方法で呼び出されます。このコールバックは、アプリがバックキーを押して適切に閉じられた場合にのみ実行されます。アプリを最小化した場合(一時停止状態)、このコールバックはサービスの終了時に呼び出されません。 (理由を探す)

最近、別の方法を見つけました。強制終了されたサービスは、GCM通知イベントを介して再開できます。デバイス上でアプリが強制終了されたときにGCMが機能するかどうかは疑問です(これを確認して動作を確認する必要があります)。しかし、これは確かに「これらのOEMは、プログラマーの人生を地獄にしました!)。

2
Akki