340

デバイスが Android で起動したときにサービスを開始しようとしましたが、動作させることができません。オンラインでいくつかのリンクを見てきましたが、どのコードも機能しません。私は何かを忘れていますか?

AndroidManifest.xml

<receiver
    android:name=".StartServiceAtBootReceiver"
    android:enabled="true"
    android:exported="false"
    android:label="StartServiceAtBootReceiver" >
    <intent-filter>
        <action android:name="android.intent.action._BOOT_COMPLETED" />
    </intent-filter>
</receiver>

<service
    android:name="com.test.RunService"
    android:enabled="true" />

ブロードキャストレシーバー

public void onReceive(Context context, Intent intent) {
    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
        Intent serviceLauncher = new Intent(context, RunService.class);
        context.startService(serviceLauncher);
        Log.v("TEST", "Service loaded at start");
    }
}
4

16 に答える 16

608

他の回答は良さそうですが、すべてを 1 つの完全な回答にまとめたいと思いました。

AndroidManifest.xmlファイルには次のものが必要です。

  1. あなたの<manifest>要素で:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
  2. 要素内で (必ず、<application>完全修飾された [または相対] クラス名を使用してくださいBroadcastReceiver):

    <receiver android:name="com.example.MyBroadcastReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
        </intent-filter>  
    </receiver>
    

    android:enabled( 、などの属性は必要ありませんexported。Android の既定値は正しいです)

    MyBroadcastReceiver.java

    package com.example;
    
    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Intent startServiceIntent = new Intent(context, MyService.class);
            context.startService(startServiceIntent);
        }
    }
    

元の質問から:

  • <receiver>要素が要素内にあった<application>かどうかは不明です
  • BroadcastReceiverの正しい完全修飾 (または相対) クラス名が指定されたかどうかは不明です。
  • にタイプミスがありました<intent-filter>
于 2011-03-25T23:55:48.213 に答える
85

追加情報として: BOOT_COMPLETE は、外部ストレージがマウントされる前にアプリケーションに送信されます。そのため、アプリケーションが外部ストレージにインストールされている場合、BOOT_COMPLETE ブロードキャスト メッセージは受信されません。

詳細については、「ブート完了」をリッスンするブロードキャスト レシーバーのセクションを参照してください。

于 2010-11-22T13:59:39.760 に答える
70

デバイスの起動時にサービスを開始する方法 (自動実行アプリなど)

最初に: Android 3.1 以降のバージョンでは、ユーザーが一度もアプリを起動したことがない場合、またはユーザーがアプリを「強制終了」した場合、BOOT_COMPLETE を受け取りません。これは、マルウェアがサービスを自動的に登録するのを防ぐために行われました。このセキュリティ ホールは、新しいバージョンの Android で解決されました。

解決:

アクティビティでアプリを作成します。ユーザーが一度実行すると、アプリは BOOT_COMPLETE ブロードキャスト メッセージを受信できます。

2 番目の場合: 外部ストレージがマウントされる前に BOOT_COMPLETE が送信されます。アプリが外部ストレージにインストールされている場合、BOOT_COMPLETE ブロードキャスト メッセージを受信しません。

この場合、2 つの解決策があります。

  1. アプリを内部ストレージにインストールする
  2. 内部ストレージに別の小さなアプリをインストールします。このアプリは BOOT_COMPLETE を受け取り、外部ストレージで 2 つ目のアプリを実行します。

アプリが既に内部ストレージにインストールされている場合、以下のコードは、デバイスの起動時にサービスを開始する方法を理解するのに役立ちます。


Manifest.xml 内

許可:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

BOOT_COMPLETED レシーバーを登録します。

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

サービスを登録します。

<service android:name="org.yourapp.YourCoolService" />

受信機の OnBoot.java:

public class OnBoot extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // Create Intent
        Intent serviceIntent = new Intent(context, YourCoolService.class);
        // Start service
        context.startService(serviceIntent);

    }

 }

HTC の場合、デバイスが RECEIVE_BOOT_COMPLETED をキャッチしない場合、このコードをマニフェストに追加する必要があるかもしれません:

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

レシーバーは次のようになります。

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

エミュレータまたは実デバイスを再起動せずに BOOT_COMPLETED をテストする方法は? それは簡単です。これを試して:

adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED

デバイスIDを取得するには?ID を持つ接続されたデバイスのリストを取得します。

adb devices

デフォルトではADTのadbは次の場所にあります:

adt-installation-dir/sdk/platform-tools

楽しみ!)

于 2014-09-24T21:04:50.707 に答える
34

一緒に

<action android:name="android.intent.action.BOOT_COMPLETED" />  

また、

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

HTC デバイスが BOOT_COMPLETED をキャッチしないようです

于 2013-05-14T11:52:10.877 に答える
20

質問の冒頭に、タイプミスがあることに注意してください。

<action android:name="android.intent.action._BOOT_COMPLETED"/>

それ以外の :

<action android:name="android.intent.action.BOOT_COMPLETED"/>

1つの小さな「_」とこのすべての問題:)

于 2011-02-05T09:19:05.857 に答える
13

>のFast Bootオプションが原因である可能性があることが今わかりましたSettingsPower

このオプションをオフにすると、アプリケーションはこのブロードキャストを受信しますが、それ以外の場合は受信しません。

ちなみに私は着てAndroid 2.3.3HTC Incredible Sます。

それが役に立てば幸い。

于 2012-01-11T20:21:57.213 に答える
13

マニフェストに追加する必要があると思います:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
于 2010-05-06T21:14:42.977 に答える
7

言及されたすべての回答とトリックを試した後、コードが私の電話で機能しない理由がついにわかりました。「Huawei Honor 3C Android 4.2.2」などの一部の Android スマートフォンでは、設定にStatup Managerメニューがあり、リストでアプリをチェックする必要があります。:)

于 2015-09-06T19:20:27.463 に答える
5

追加の<category>-tag がありますが、それが違いを生むかどうかはわかりません。

<receiver android:name="BootIntentReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
            <category android:name="android.intent.category.HOME" />  
        </intent-filter>  
</receiver>

"android.intent.action.BOOT_COMPLETED".equals(intent.getAction()とにかく、受信者はおそらくその意図しか受け取らないため、 if-clause を省略しようとしましたか?

于 2010-05-06T21:12:18.113 に答える
4

このリンクを参照してくださいhttp://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html サービスで起動を使用する手順

于 2014-02-17T04:24:14.900 に答える
0

I faced with this problem if i leave the empty constructor in the receiver class. After the removing the empty contsructor onRreceive methos started working fine.

于 2014-12-29T14:34:59.863 に答える