まず第一に、この種の質問が何百件も寄せられていることは知っていますが、しばらくの間それらをすべてチェックしてきましたが、解決策が見つかりませんでした。
この答え BOOT_COMPLETEDは、ユーザーが最初にアプリケーションを起動しない限り、Android version 3.1の後、アプリケーションに送信しないと言った私は本当にそれを処理する必要があります、そうでなければ、ユーザーの介入なしで何かをすることに反対しています。
ここに私のAndroidManifestがあります:
<manifest ... >
<!-- to be activated service on boot is completed -->
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<application ... >
<!-- to receive data when boot completed -->
<receiver
Android:name="myPackage.BootReceiver"
Android:enabled="true"
Android:exported="true"
Android:permission="Android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
前もって感謝します。
Edit:BroadcastReceiverで見るべきものはほとんどありませんが、ここで必要なのは次のとおりです。
package myPackage
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Utils.LogI("BootReceiver", "BootReceiver received!");
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
// Do my stuff
}
}
}
これは私のために働いた
AndroidManifest.xml
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
<application>
<receiver Android:name=".BootCompletedReceiver" >
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED" />
<action Android:name="Android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<service Android:name="NotifyingDailyService" >
</service>
BootCompletedReceiver.class
public class BootCompletedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
// TODO Auto-generated method stub
Log.w("boot_broadcast_poc", "starting service...");
context.startService(new Intent(context, NotifyingDailyService.class));
}
}
Service.class
public class NotifyingDailyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent pIntent, int flags, int startId) {
// TODO Auto-generated method stub
Toast.makeText(this, "NotifyingDailyService", Toast.LENGTH_LONG).show();
Log.i("com.example.bootbroadcastpoc","NotifyingDailyService");
return super.onStartCommand(pIntent, flags, startId);
}
}
これは古くて基本的な質問ですが、多くのAndroid開発者は今でもこのトラブルについて混乱しています。なぜならDOCSを注意深く読む時間をとらないでください
私は誰かがいくつかのリンクを共有していると言って、それを言った: "これはもう機能しません"、それは完全に間違っていると誤解されているです。
この懸念について:"Android version 3.1"の後、ユーザーが最初にアプリケーションを起動しない限り、BOOT_COMPLETEDはアプリケーションに送信されないという回答がありました。、これらの行を読んで(公式ドキュメントから: https://developer.Android.com/about/versions/Android-3.1.html#launchcontrols )正しく理解する:
アプリケーションの停止状態は、アクティビティの停止状態と同じではないことに注意してください。システムは、これら2つの停止状態を個別に管理します。
アプリケーションは、最初にインストールされたがまだ起動されていないであり、ユーザーによって手動で停止されたとき(Manage Applications ).(これらはアプリの強制停止を意味します)
つまり、ユーザーはアプリケーションを起動するためにインストール後少なくとも1回を起動し、アプリは通常どおりOSから暗黙的なブロードキャストを受信できます。 (一度だけ起動するだけ!)
"インストールされて開かないアプリは一度だけですか?"、うん、それはスパムと詐欺のアプリです、このテクニックユーザーがそれを防ぐのを助けます!
FURTHERMORE、UNTIL NOW(Android Oreo 8.0)、Androidマニフェストでの暗黙的なブロードキャストの登録制限( https://developer.Android.com/about /versions/oreo/background.html#broadcasts )、いくつかのブロードキャストは現在これらの制限から免除されていますAnd BOOT_COMPLETEDは最初one彼らは!( https://developer.Android.com/guide/components/broadcast-exceptions.html )に言及しています
ところで、これは私がこの質問に対して見つけた最良の解決策です:
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver Android:name=".BootReceiver" Android:enabled="true" Android:exported="true">
<intent-filter>
<category Android:name="Android.intent.category.DEFAULT"/>
<action Android:name="Android.intent.action.BOOT_COMPLETED"/>
<action Android:name="Android.intent.action.QUICKBOOT_POWERON"/>
<!--For HTC devices-->
<action Android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
最後に、文書を注意深く読み、コードを2回考えてください:3!
問題はデバイスにあります。一部のデバイスは、内部アプリにのみこのアクションの受信を許可します(例:Android 5.1)。
これを回避策としてインテントフィルターに追加できます。
アクションAndroid:name="Android.intent.action.USER_PRESENT"
これは、ユーザーがデバイスのロックを解除した後にトリガーされます。
いくつかの新しいタブレットとAndroidデバイスにはデフォルトでセキュリティアプリケーションがあります。これらのアプリは自動起動モードをロックする場合があります。この安全なアプリの例はMyAsusマネージャーです。 「あなたのアプリに
Htcデバイスの場合 add com.htc.intent.action.QUICKBOOT_POWERON
<receiver Android:enabled="true" Android:name=".receivers.BootUpReceiver">
<intent-filter>
<category Android:name="Android.intent.category.DEFAULT" />
<action Android:name="Android.intent.action.BOOT_COMPLETED"/>
<action Android:name="Android.intent.action.QUICKBOOT_POWERON"/>
<action Android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
私が経験した問題は、BOOT_COMPLETED
およびQUICKBOOT_POWERON
一緒にAndroid 6.0.1パネルから電源をオフにしたときに、常に意図がトリガーされませんでした。かなり長い間インターネットを検索しており、QUICKBOOT_POWEROFF
マニフェストファイル。
こちらもご覧ください:
HTCの「高速ブート」はBOOT_COMPLETEDインテントをブロードキャストせず、アラームマネージャからインテントを消去しません
回避策として、NotificationListenerサービスを作成する必要があります
デバイスがBuild.VERSION_CODES.JELLY_BEAN_MR2であり、Huaweiデバイスのようにバッテリー最適化オプションがある場合は、NotificationListenerの許可を要求し、以下のコードのようにNotificationListenerサービスを作成する必要があります。受信機でBOOT_COMPLETEDを取得します
<receiver
Android:name=".TestRes"
Android:enabled="true"
Android:exported="true">
<intent-filter Android:priority="1">
<category Android:name="Android.intent.category.DEFAULT"/>
<action Android:name="Android.intent.action.BOOT_COMPLETED"/>
<action Android:name="Android.intent.action.QUICKBOOT_POWERON"/>
<action Android:name="Android.intent.action.USER_PRESENT"/>
<action Android:name="Android.intent.action.REBOOT"/>
</intent-filter>
</receiver>
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public class DevAppNotificationListener extends NotificationListenerService {
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
// super.onNotificationPosted(sbn);
}
@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
// super.onNotificationRemoved(sbn);
}
}
static boolean CheckNotificationLisPermission(Context context)
{
return NotificationManagerCompat.getEnabledListenerPackages (context).contains(context.getApplicationContext().getPackageName());
}
Intent intent = new Intent("Android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
context.startActivityForResult(intent, callBackResultIntent);