サンプルコードを この のリンクで使用してみましたが、古すぎるようで、うまくいきませんでした。では、Androidの起動が完了したときにアプリに自動的に起動させるには、どのような変更を加え、どのファイルに変更を加える必要がありますか。
まず、あなたのAndroidManifest.xml
に許可が必要です。
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
また、yourAndroidManifest.xml
で、サービスを定義し、BOOT_COMPLETEDアクションを待ちます。
<service Android:name=".MyService" Android:label="My Service">
<intent-filter>
<action Android:name="com.myapp.MyService" />
</intent-filter>
</service>
<receiver
Android:name=".receiver.StartMyServiceAtBootReceiver"
Android:label="StartMyServiceAtBootReceiver">
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
次に、BOOT_COMPLETEDアクションを取得してサービスを開始する受信機を定義する必要があります。
public class StartMyServiceAtBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent serviceIntent = new Intent(context, MyService.class);
context.startService(serviceIntent);
}
}
}
そして今、あなたのサービスは電話が起動したときに実行されているはずです。
これは、Androidデバイスの再起動後にactivityの実行を開始する方法です。
このコードをAndroidManifest.xml
ファイルの<application>
要素内に挿入します(<activity>
要素内のnot):
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
Android:enabled="true"
Android:exported="true"
Android:name="yourpackage.yourActivityRunOnStartup"
Android:permission="Android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED" />
<action Android:name="Android.intent.action.QUICKBOOT_POWERON" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
次に、新しいクラスyourActivityRunOnStartup
を作成します(マニフェストのAndroid:name
要素に指定された<receiver>
と一致)。
package yourpackage;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
public class yourActivityRunOnStartup extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
}
注:アクティビティはアクティビティ外のコンテキストから起動されるため、呼び出しi.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
は重要です。これがなければ、活動は開始されません。
また、Android:enabled
タグの値Android:exported
、Android:permission
、および<receiver>
は必須ではないようです。アプリはこれらの値なしでイベントを受け取ります。こちらの例 をご覧ください 。
ACTION_BOOT_COMPLETE を聞いて、そこから必要なことをしてください。ここに コードスニペット があります。
更新:
回答時の元のリンクは停止しているため、コメントに基づいて、ここではリンクされたコードです。リンクが停止したときにコードを見逃すことはありません。
AndroidManifest.xml(アプリケーションパート)の場合:
<receiver Android:enabled="true" Android:name=".BootUpReceiver"
Android:permission="Android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
...
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
...
public class BootUpReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MyActivity.class); //MyActivity can be anything which you want to start on bootup...
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
また、起動時にAndroidアプリケーションを起動するためにコードを変更したくない場合は、AutoStartのようなアプリを使用できます。 AutoStart - No root
Seanの解決策は当初私にはうまくいきませんでした(Android 4.2.2)。私は同じAndroidプロジェクトにダミーのアクティビティを追加し、少なくとも1回はデバイス上でそのアクティビティを手動で実行する必要がありました。その後、Seanのソリューションは機能し始め、その後の再起動後にBroadcastReceiverに通知されました。
もう1つの方法は、Android.intent.action.USER_PRESENT
の代わりにAndroid.intent.action.BOOT_COMPLETED
を使用して、ブートプロセス中の速度低下を回避することです。ただし、これは、ユーザーがロック画面を有効にしている場合のみtrue
です。それ以外の場合、このインテントはブロードキャストされません。
リファレンスブログ- AndroidのACTION_USER_PRESENT意図の問題
この質問に、私が数日間直面していた点を1つ追加したいと思います。私はすべての答えを試しましたが、それらは私のために働いていませんでした。 Androidバージョン5.1を使用している場合は、これらの設定を変更してください。
Androidバージョン5.1を使用している場合は、アプリ設定から(起動を制限する)選択を解除する必要があります。
設定>アプリ>あなたのアプリ>起動を制限する(選択解除)