回答:
まず、あなたの許可が必要ですAndroidManifest.xml
:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
また、でAndroidManifest.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);
}
}
}
これで、電話が起動したときにサービスが実行されているはずです。
Intent.ACTION_BOOT_COMPLETED
レシーバーで文字列をハードコーディングするのではなく、使用する方が良いことを追加したかっただけです。また、Intent(context, MySystemService.class)
インテントを作成するときに新しいコンストラクタを使用する必要があります。
Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own file
はpublic class
ラインに乗っています。何か案は?
これは、Androidデバイスの再起動後にアクティビティの実行を開始する方法です。
このコードをAndroidManifest.xml
ファイル内の<application>
要素内(要素内ではなく<activity>
)に挿入します。
<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>
のタグは必須ではないようです。アプリはこれらの値なしでイベントを受け取ります。こちらの例をご覧ください。
Application
か?たぶんonCreate()
?
onReceive()
がBroadcastReceiver
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);
}
}
ソース:https : //web.archive.org/web/20150520124552/http : //www.androidsnippets.com/autostart-an-application-at-bootup
さらに、コードを変更したくない場合は、AutoStartなどのアプリを使用して、起動時にAndroidアプリケーションを起動できます。AutoStart-ルートなし
私が数日間直面していたこの質問に1つのポイントを追加したいと思います。すべての答えを試しましたが、うまくいきませんでした。Androidバージョン5.1を使用している場合は、これらの設定を変更してください。
Androidバージョン5.1を使用している場合は、アプリの設定から(起動を制限する)をオフにする必要があります。
設定>アプリ>アプリ>起動を制限(選択解除)
別のアプローチは、起動プロセス中の速度低下を回避するandroid.intent.action.USER_PRESENT
代わりにを使用するandroid.intent.action.BOOT_COMPLETED
ことです。ただし、これはtrue
、ユーザーがロック画面を有効にしている場合に限られます。それ以外の場合、このインテントはブロードキャストされません。
リファレンスブログ -AndroidのACTION_USER_PRESENTインテントの問題