티스토리 뷰
728x90
출처
- [Android]단말 부팅 시 App 실행하기(BOOT_COMPLETED) - kanzler의 세상 이야기
- Android에서 Service 로 Background 에서 음악 플레이 하기 : Android Developer88
- Create services never stop in Android – Razia Sandhu – Medium
- [Android] 사용자가 강제로 서비스를 종료하더라도 자동으로 서비스를 다시 시작하는 방법은 무엇입니까? Service Alarm | CODE Q&A 해결 된 문제 [한국어]
- android - clear Recent apps wipe the apps memory and my receiver stopped working - Stack Overflow
- broadcastreceiver - Trying to start a service on boot on Android - Stack Overflow
- Android 8.0: java.lang.IllegalStateException: Not allowed to start service Intent - Stack Overflow
- 장범석님의 개발일지: [안드로이드] Task의 종료시점 확인하기
안드로이드 부팅 이벤트 받기
BootReceiver,java - 부팅 이벤트를 받은 BroadcastReceiver를 상속받은 클래스 생성
package com.bluexmas.common; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Handler; import android.util.Log; import android.widget.Toast; public class BootReceiver extends BroadcastReceiver { private final static String TAG = BootReceiver.class.getSimpleName(); // BroadcastReceiver를 상속하여 처리 해줍니다. @Override public void onReceive(final Context context, Intent intent) { // TODO Auto-generated method stub // 전달 받은 Broadcast의 값을 가져오기 // androidmanifest.xml에 정의한 인텐트 필터를 받아 올 수 있습니다. String action = intent.getAction(); // 전달된 값이 '부팅완료' 인 경우에만 동작 하도록 조건문을 설정 해줍니다. if (action.equals("android.intent.action.BOOT_COMPLETED")) { // TODO // 부팅 이후 처리해야 코드 작성 // Ex.서비스 호출, 특정 액티비티 호출등등 Log.d(TAG, "action = " + action); // new Handler().postDelayed(new Runnable() { // 3초 후에 실행 @Override public void run() { //Toast.makeText(context, "-- BootReceiver.onReceive", Toast.LENGTH_LONG).show(); // BackgroundService Intent serviceLauncher = new Intent(context, BackgroundService.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { context.startForegroundService(serviceLauncher); } else { context.startService(serviceLauncher); } } }, 3000); } } public static boolean isServiceRunning(Context context, Class serviceClass) { ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (serviceClass.getName().equals(service.service.getClassName())) { Log.i (TAG,"ServiceRunning? = "+true); return true; } } Log.i(TAG,"ServiceRunning? = "+ false); return false; } }
AndroidManifest.xml 내용추가
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bluexmas.main" > <!-- 안드로이드 부팅 이벤트 받기 권한 추가 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:name="com.bluexmas.main.BluexmasApplication" android:icon="@drawable/icon" android:label="@string/app_name" android:largeHeap="true"> <!-- 안드로이드 부팅 이벤트 받기 : BroadcastReceiver --> <receiver android:name="com.bluexmas.common.BootReceiver" android:enabled="true" android:exported="false" android:label="BOOTReceiver"> <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
앱이 종료 이후 백그라운드 서비스 실행 유지
서비스 생성
package com.bluexmas.common; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.os.SystemClock; import android.util.Log; import java.util.Timer; import java.util.TimerTask; public class BackgroundService extends Service { private final static String TAG = BackgroundService.class.getSimpleName(); private Context context = null; public int counter=0; // 생성자1 : 반듯이 필요 public BackgroundService() { } // 생성자2 public BackgroundService(Context applicationContext) { super(); context = applicationContext; } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); // 서비스에서 가장 먼저 호출됨(최초에 한번만) Log.d(TAG, "BackgroundService.onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); // 서비스가 호출될 때마다 실행 Log.d(TAG, "BackgroundService.onStartCommand"); // startTimer(); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); // 서비스가 종료될 때 실행 Log.d(TAG, "BackgroundService.onDestroy"); // Intent broadcastIntent = new Intent("com.bluexmas.common.RestartService"); sendBroadcast(broadcastIntent); stoptimertask(); } private Timer timer; private TimerTask timerTask; long oldTime=0; public void startTimer() { //set a new Timer timer = new Timer(); //initialize the TimerTask's job initializeTimerTask(); //schedule the timer, to wake up every 1 second timer.schedule(timerTask, 1000, 1000); // } /** * it sets the timer to print the counter every x seconds */ public void initializeTimerTask() { timerTask = new TimerTask() { public void run() { Log.i(TAG, "in timer ++++ "+ (counter++)); } }; } /** * not needed */ public void stoptimertask() { //stop the timer, if it's not already null if (timer != null) { timer.cancel(); timer = null; } } }
AndroidManifest.xml 내용추가 - 서비스와 종료 이벤트를 받은 receiver 등록
<!-- BackgroundService --> <service android:name="com.bluexmas.common.BackgroundService" android:enabled="true" > </service> <receiver android:name="com.bluexmas.common.RestarterBroadcastReceiver" android:enabled="true" android:exported="true" android:label="RestartServiceWhenStopped"> <intent-filter> <action android:name="com.bluexmas.common.RestartService" /> </intent-filter> </receiver> </application>
종료 이벤트를 받은 receiver 클래스 생성
package com.bluexmas.common; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class RestarterBroadcastReceiver extends BroadcastReceiver { private final static String TAG = RestarterBroadcastReceiver.class.getSimpleName(); @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "RestarterBroadcastReceiver.onReceive"); context.startService(new Intent(context, BackgroundService.class)); } }
MainActivity - 서비스가 실행하고 있지 않는 경우 서비스 실행
// BackgroundService private Intent mBackgroundServiceIntent; private BackgroundService mBackgroundService; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... 생략 ... // BackgroundService mBackgroundService = new BackgroundService(getApplicationContext()); mBackgroundServiceIntent = new Intent(getApplicationContext(), mBackgroundService.getClass()); // 서비스가 실행 중인지 확인 if (!BootReceiver.isServiceRunning(this, mBackgroundService.getClass())) { // 서비스가 실행하고 있지 않는 경우 서비스 실행 startService(mBackgroundServiceIntent); } }
사용자가 강제로 서비스를 종료하더라도 자동으로 서비스를 다시 시작하기
AndroidManifest.xml 내용추가 - android:stopWithTask="false"로 설정해야 onTaskRemoved 메소드가 호출됨
<!-- BackgroundService --> <service android:name="com.bluexmas.common.BackgroundService" android:enabled="true" android:stopWithTask="false"> </service>
기존 BackgroundService 클래스에 onTaskRemoved 오버라이드 메소드 구현
// 사용자가 강제로 서비스를 종료하더라도 자동으로 서비스를 다시 시작하는 방법은 무엇입니까? @Override public void onTaskRemoved(Intent rootIntent) { Log.d(TAG, "BackgroundService.onTaskRemoved"); //create an intent that you want to start again. Intent intent = new Intent(getApplicationContext(), BackgroundService.class); PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent); super.onTaskRemoved(rootIntent); }
댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- SAS
- ble
- android
- 동경
- flex
- Delphi
- 전예희
- Spring MVC
- MySQL
- 지스타2007
- BPI-M4
- Delphi Tip
- Linux
- JavaScript
- 송주경
- NDK
- 일본여행
- koba2010
- ubuntu
- ffmpeg
- Java
- Xcode
- KOBA
- Mac
- 서울오토살롱
- Spring
- oracle
- 튜닝쇼 2008
- sas2009
- 레이싱모델 익스트림 포토 페스티벌
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함