web-dev-qa-db-ja.com

BOOT_COMPLETEDが機能しないAndroid

まず第一に、この種の質問が何百件も寄せられていることは知っていますが、しばらくの間それらをすべてチェックしてきましたが、解決策が見つかりませんでした。

この答え 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
    }
}
}
38
yahya

これは私のために働いた

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);
}
}
66
Piyush

これは古くて基本的な質問ですが、多くのAndroid開発者は今でもこのトラブルについて混乱しています。なぜならDOCSを注意深く読む時間をとらないでください

私は誰かがいくつかのリンクを共有していると言って、それを言った: "これはもう機能しません"、それは完全に間違っている誤解されているです。

この懸念について:"Android version 3.1"の後、ユーザーが最初にアプリケーションを起動しない限り、BOOT_COMPLETEDはアプリケーションに送信されないという回答がありました。、これらの行を読んで(公式ドキュメントから: https://developer.Android.com/about/versions/Android-3.1.html#launchcontrols )正しく理解する:

  • アプリケーションの停止状態は、アクティビティの停止状態と同じではないことに注意してください。システムは、これら2つの停止状態を個別に管理します。

  • アプリケーションは、最初にインストールされたがまだ起動されていないであり、ユーザーによって手動で停止されたとき(Manage Applications ).(これらはアプリの強制停止を意味します)

enter image description here

  1. つまり、ユーザーはアプリケーションを起動するためにインストール後少なくとも1回を起動し、アプリは通常どおりOSから暗黙的なブロードキャストを受信できます。 (一度だけ起動するだけ!

  2. "インストールされて開かないアプリは一度だけですか?"、うん、それはスパムと詐欺のアプリです、このテクニックユーザーがそれを防ぐのを助けます!

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!

32

問題はデバイスにあります。一部のデバイスは、内部アプリにのみこのアクションの受信を許可します(例:Android 5.1)。

これを回避策としてインテントフィルターに追加できます。

アクションAndroid:name="Android.intent.action.USER_PRESENT"

これは、ユーザーがデバイスのロックを解除した後にトリガーされます。

4
Gà Và Sói

いくつかの新しいタブレットとAndroidデバイスにはデフォルトでセキュリティアプリケーションがあります。これらのアプリは自動起動モードをロックする場合があります。この安全なアプリの例はMyAsusマネージャーです。 「あなたのアプリに

4
iman kazemayni

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>
4
Xar E Ahmer

私が経験した問題は、BOOT_COMPLETEDおよびQUICKBOOT_POWERON一緒にAndroid 6.0.1パネルから電源をオフにしたときに、常に意図がトリガーされませんでした。かなり長い間インターネットを検索しており、QUICKBOOT_POWEROFFマニフェストファイル。

こちらもご覧ください:

HTCの「高速ブート」はBOOT_COMPLETEDインテントをブロードキャストせず、アラームマネージャからインテントを消去しません

1
Willem Luijk

回避策として、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>

1 NotificationListenerサービスを作成します。

@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);
    }


}

2 NotificationListenerが許可されているかどうかを確認します。

static boolean CheckNotificationLisPermission(Context context)
    {

        return NotificationManagerCompat.getEnabledListenerPackages (context).contains(context.getApplicationContext().getPackageName());

    }

3でない場合、NotificationListenerの許可を求めます。

 Intent intent = new Intent("Android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
            context.startActivityForResult(intent, callBackResultIntent);
0
ahmadzuhair