デバイスの起動時にサービスを開始する方法(自動実行アプリなど)
まず、Android 3.1以降のバージョンでは、ユーザーがアプリを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
楽しい!)