起動時にサービスを開始する必要があります。たくさん検索しました。彼らはBroadcastreceiverについて話している。私はAndroid開発に不慣れなため、Androidのサービスについて明確に把握できませんでした。ソースコードを提供してください。
AlarmManager
再起動後に定期実行を開始するには、非常によく似た手順(onReceive
方法の内容に違いがある)に従う必要があることに注意してください
起動時にサービスを開始する必要があります。たくさん検索しました。彼らはBroadcastreceiverについて話している。私はAndroid開発に不慣れなため、Androidのサービスについて明確に把握できませんでした。ソースコードを提供してください。
AlarmManager
再起動後に定期実行を開始するには、非常によく似た手順(onReceive
方法の内容に違いがある)に従う必要があることに注意してください
回答:
を作成しBroadcastReceiver
て登録し、ACTION_BOOT_COMPLETEDを受け取ります。RECEIVE_BOOT_COMPLETED権限も必要です。
あなたの受信機:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent myIntent = new Intent(context, YourService.class);
context.startService(myIntent);
}
}
あなたのAndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.broadcast.receiver.example"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<activity android:name=".BR_Example"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Declaring broadcast receiver for BOOT_COMPLETED event. -->
<receiver android:name=".MyReceiver" android:enabled="true" android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
<!-- Adding the permission -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
</manifest>
デバイスの起動時に自動的に起動する独自のアプリケーションサービスを登録することができます。たとえば、httpサーバーからプッシュイベントを受信し、新しいイベントが発生したらすぐにユーザーに通知する場合に必要です。サービスを開始する前に、ユーザーが手動でアクティビティを開始する必要はありません...
とても簡単です。まず、アプリにRECEIVE_BOOT_COMPLETED権限を付与します。次に、BroadcastReveiverを登録する必要があります。これをBootCompletedIntentReceiverと呼びます。
Manifest.xmlは次のようになります。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jjoe64"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application> <receiver android:name=".BootCompletedIntentReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <service android:name=".BackgroundService"/> </application> </manifest>
最後のステップとして、レシーバーを実装する必要があります。このレシーバーはバックグラウンドサービスを開始するだけです。
package com.jjoe64; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.preference.PreferenceManager; import com.jjoe64.BackgroundService; public class BootCompletedIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { Intent pushIntent = new Intent(context, BackgroundService.class); context.startService(pushIntent); } } }
http://www.jjoe64.com/2011/06/autostart-service-on-device-boot.htmlから
android.intent.category.LAUNCHER
。
ここに掲載されているほとんどのソリューションには重要な部分が欠けています。ウェイクロックなしでそれを行うと、サービスが処理を完了する前に強制終了されるリスクがあります。この解決策を別のスレッドで見て、ここでも答えてください。
以来WakefulBroadcastReceiverは、API 26で廃止され、それが推奨される 26以下のAPIレベルのために
ウェイクロックを取得する必要があります。幸い、サポートライブラリは、これを行うクラスを提供します。
public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// This is the Intent to deliver to our service.
Intent service = new Intent(context, SimpleWakefulService.class);
// Start the service, keeping the device awake while it is launching.
Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
startWakefulService(context, service);
}
}
次に、サービスで、ウェイクロックを解放してください。
@Override
protected void onHandleIntent(Intent intent) {
// At this point SimpleWakefulReceiver is still holding a wake lock
// for us. We can do whatever we need to here and then tell it that
// it can release the wakelock.
...
Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
SimpleWakefulReceiver.completeWakefulIntent(intent);
}
WAKE_LOCK権限を追加し、マニフェストにレシーバーを登録することを忘れないでください。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
...
<service android:name=".SimpleWakefulReceiver">
<intent-filter>
<action android:name="com.example.SimpleWakefulReceiver"/>
</intent-filter>
</service>
BOOT_COMPLETEおよびREBOOTに登録する必要があります
<receiver android:name=".Services.BootComplete">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.REBOOT"/>
</intent-filter>
</receiver>
また、作成したサービスをマニフェストに登録し、次のように使用権限を使用します
<application ...>
<service android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.example.MyBroadcastReciver"/>
</intent-filter>
</service>
</application>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
ブラッドキャストであなたのサービスを呼び出します
public class MyBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent myIntent = new Intent(context, MyService.class);
context.startService(myIntent);
}
}
まず、manifest.xmlファイルにレシーバーを登録します。
<receiver android:name="com.mileagelog.service.Broadcast_PowerUp" >
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
次に、このレシーバーのブロードキャストを次のように記述します。
public class Broadcast_PowerUp extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_POWER_CONNECTED)) {
Toast.makeText(context, "Service_PowerUp Started",
Toast.LENGTH_LONG).show();
} else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) {
Toast.makeText(context, "Service_PowerUp Stoped", Toast.LENGTH_LONG)
.show();
}
}
}
Android O
OSが28以上の場合にサービスを再起動するには、次のコードを使用します。このコードを使用KOTLIN VERSION
1)マニフェストに権限を追加します
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
2)を作成しClass
て拡張するBroadcastReceiver
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
import android.util.Log
import androidx.core.content.ContextCompat
class BootCompletedReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, arg1: Intent?) {
Log.d("BootCompletedReceiver", "starting service...")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ContextCompat.startForegroundService(context, Intent(context, YourServiceClass::class.java))
} else {
context.startService(Intent(context, YourServiceClass::class.java))
}
}
}
3)アプリケーションタグの下で、次のようにマニフェストファイルで宣言します。
<receiver android:name=".utils.BootCompletedReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
Plsは26を超えるAPIについてJobSchedulerをチェックします
WakeLockはこれに最適なオプションですが、APIレベル26では推奨されていません。26を超えるAPIレベルを検討する場合は、このリンクを
確認して
ください。https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html# startWakefulService(android.content.Context、%20android.content.Intent)
それは言う
Android O以降、バックグラウンドチェックの制限により、このクラスは一般的に役に立たなくなりました。(ブロードキャストの受信からサービスを開始することは、一般に安全ではありません。この時点でアプリがフォアグラウンドにあることが保証されていないため、許可されているためです。)代わりに、開発者はandroidを使用する必要があります。 app.job.JobSchedulerを使用してジョブをスケジュールします。これにより、アプリがウェイクロックを保持している必要はありません(システムがジョブのウェイクロックを保持します)。
cosider JobScheduler
https://developer.android.com/reference/android/app/job/JobSchedulerのように
開始するよりも何かをすることであり、それを維持することである場合、ブロードキャストACTION_BOOT_COMPLETEDを受信できます。
フォアグラウンドplsに関するものでない場合は、ユーザー補助機能サービスが実行できるかどうかを確認してください
新しいAndroidバージョンではレシーバーからのサービスの開始が許可されていないため、別のオプションは、ブロードキャストレシーバーからアクティビティを開始し、onCreate()内でサービスを開始した後にアクティビティを終了することです。
startForeground()
は、サービスでご利用ください。そうしないと、Androidとそのユーザーがスペースの浪費としてサービスを停止し、Androidマーケットで不愉快なコメントを受け取ります。起動時にサービスを開始したいと考えるほとんどの状況では、サービスを継続的にAlarmManager
実行するのではなく、定期的に実行できるように使用する方が適切です。