デバイスの起動時にサービスを開始する方法 (自動実行アプリなど)
最初に: Android 3.1 以降のバージョンでは、ユーザーが一度もアプリを起動したことがない場合、またはユーザーがアプリを「強制終了」した場合、BOOT_COMPLETE を受け取りません。これは、マルウェアがサービスを自動的に登録するのを防ぐために行われました。このセキュリティ ホールは、新しいバージョンの Android で解決されました。
解決:
アクティビティでアプリを作成します。ユーザーが一度実行すると、アプリは BOOT_COMPLETE ブロードキャスト メッセージを受信できます。
2 番目の場合: 外部ストレージがマウントされる前に BOOT_COMPLETE が送信されます。アプリが外部ストレージにインストールされている場合、BOOT_COMPLETE ブロードキャスト メッセージを受信しません。
この場合、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
楽しみ!)