부팅 할 때 서비스를 시작해야합니다. 나는 많이 검색했다. 그들은 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>
마지막 단계로 Receiver를 구현해야합니다. 이 수신기는 백그라운드 서비스를 시작합니다.
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
!
여기에 게시 된 대부분의 솔루션에는 중요한 부분이 누락되어 있습니다. wake lock없이 수행하면 처리가 완료되기 전에 서비스가 종료 될 위험이 있습니다. 이 솔루션을 다른 스레드에서 보았고 여기에서도 대답했습니다.
이후 WakefulBroadcastReceiver는 API 26에서 더 이상 사용되지 않습니다 그것은 추천 (26) 아래의 API 레벨에 대한
wake lock을 얻어야합니다. 다행히 지원 라이브러리는 이를 수행 할 수 있는 클래스 를 제공 합니다.
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);
}
}
그런 다음 서비스에서 wake lock을 해제해야합니다.
@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"/>
그런 다음 braod cast Reciever에서 서비스에 전화하십시오.
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는 JobScheduler 에서 26 이상의 API를 확인합니다.
WakeLock 은 이에 대한 최선의 옵션이지만 api 레벨 26에서는 더 이상 사용되지 않습니다. api 레벨이 26 이상인 경우이 링크를
확인하십시오.
https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html# startWakefulService (android.content.Context, % 20android.content.Intent)
그것은 말한다
Android O부터 백그라운드 확인 제한으로 인해이 클래스는 더 이상 일반적으로 유용하지 않습니다. (이 시점에서 앱이 포 그라운드에 있고 따라서 그렇게 할 수 있다는 보장이 없기 때문에 일반적으로 브로드 캐스트 수신부터 서비스를 시작하는 것은 안전하지 않습니다.) 대신 개발자는 android를 사용해야합니다 . app.job.JobScheduler 를 사용하여 작업을 예약 할 수 있으며, 그렇게하는 동안 앱이 wake lock을 유지할 필요가 없습니다 (시스템이 작업에 대한 wake lock을 유지합니다).
그래서 cosider JobScheduler
https://developer.android.com/reference/android/app/job/JobScheduler
시작하고 유지하는 것보다 무언가를하려면 방송을 수신 할 수 있습니다. ACTION_BOOT_COMPLETED
전경에 관한 것이 아니라면 접근성 서비스가 할 수 있는지 확인하십시오.
또 다른 옵션은 broadcast receiver에서 활동을 시작하고 onCreate () 내에서 서비스를 시작한 후 완료하는 것입니다. 최신 Android 버전에서는 수신기에서 서비스를 시작할 수 없습니다.
startForeground()
서비스에서 사용 하십시오. 그렇지 않으면 Android와 사용자가 공간 낭비로 인해 서비스를 중단하고 Android 마켓에서 불쾌한 댓글을 받게됩니다. 부팅시 서비스가 시작되기를 원한다고 생각하는 대부분의 상황에서는 서비스를 지속적 으로AlarmManager
실행 하는 것이 아니라 주기적으로 실행할 수 있도록 사용 하는 것이 좋습니다 .