1

서비스 및 BroadCastReceiver에 대해 배우려고합니다. 아래의 코드는 백그라운드에서 항상 실행되는 서비스입니다. 문제는 배터리 소모에 어떻게 영향을 미치는지 모른다는 것입니다. 항상 실행중인 서비스입니까?

은 배터리를 많이 소모 예정 ...

내 목표는 켜거나 화면을 감지하는 것입니다, 그래서 앱이 가깝거나 열려 백그라운드에서 실행중인 서비스를 필요로? 설명해 주시겠습니까?

이 코드 예제에서 당신에게

public class MyService extends Service{ 

    private static final String TAG = "MyService"; 
    private BroadcastReceiver mScreenOnOffReceiver; 
    private BroadcastReceiver OnOffBroadcastReceiver; 
    private NotificationManager mNotificationManager; 
    private Notification barNotif; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 

    // here to show that your service is running foreground  
    mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
     Intent bIntent = new Intent(this, WidgetBroadCastReceiver.class);  
     PendingIntent pbIntent = PendingIntent.getActivity(this, 0 , bIntent, Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     NotificationCompat.Builder bBuilder = 
       new NotificationCompat.Builder(this) 
        .setSmallIcon(R.drawable.ic_launcher) 
        .setContentTitle("STICKY") 
        .setContentText("Sub Title") 
        .setAutoCancel(true) 
        .setOngoing(true) 
        .setContentIntent(pbIntent); 
     barNotif = bBuilder.build(); 
     this.startForeground(1, barNotif); 

    // here the body of your service where you can arrange your reminders and send alerts 

    Thread mThread = new Thread() { 
     @Override 
     public void run() { 
     // Register the ScreenOnOffReceiver.java 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     mScreenOnOffReceiver = new ScreenOnOffReceiver(); 
     registerReceiver(mScreenOnOffReceiver, filter); 

     // initialize and register mScreenOnOffReceiver (no need the BroadcastReceiver class) 
     OnOffBroadcastReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
        Log.e("", "SERVICE Screen is: " + "turned OFF....."); 
       } 
      else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
        Log.e("", "SERVICE Screen is: " + "turned ON......"); 
       } 
      } 
     }; 
     registerReceiver(OnOffBroadcastReceiver, new IntentFilter(filter));  
     } 
    }; 

    mThread.start(); 

    return START_STICKY; 
    } 


    @Override 
    public void onStart(Intent intent, int startId) { 
     Toast.makeText(this, "My Service has Started", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onDestroy() { 
     Toast.makeText(this, "MyService Stopped", Toast.LENGTH_SHORT).show(); 
     unregisterReceiver(mScreenOnOffReceiver); 
     unregisterReceiver(OnOffBroadcastReceiver); 
     stopForeground(true); 
    } 
} 
+0

Wilfred Hughes를 편집 해 주셔서 감사합니다. 나는 매우 고마워. – YRTM2014

답변

0

감사, 배터리를 소모 일부 작업 (집약적 인 컴퓨팅, 네트워크 요청 등)을하지 않은 서비스를 제공합니다. 그래서 개인적으로 나는 당신의 서비스가 많은 배터리를 소비한다는 것은 분명하지 않다고 생각합니다. 하지만 서비스가 시작된 후에도 유지되므로 앱의 메모리 사용량이 더 많아집니다. 어떤면에서는 대용량 메모리 애플 리케이션은 더 많은 시스템 배터리를 필요로 할 것이며, 시스템은 전반적인 성능을 양호한 상태로 유지하기 위해 더 많은 작업을 수행해야하며, CPU, IO 및 메모리의 컴퓨팅 및 읽기/쓰기 사이클이 필요합니다. 배터리.

서비스에서 새 스레드를 시작하지 않았습니다. 즉, 서비스의 모든 작업이 주 스레드에서 실행됩니다. 이렇게하면 UI를 차단하는 오랜 시간 작업을 수행하면 높은 가능성이있는 ANR이 발생합니다. 귀하의 예에서 알림을 시작하고 브로드 캐스트 리시버를 등록하면 앱이 원활하게 실행되고 ANR이라고 불평하지 않았습니다. 그러나 당신은 그것을 인식해야합니다.

개인적으로는 BroadcastReceiverAndroidManifest.xml에 넣는 것이 더 좋을 수도 있지만 그렇게하는 것이 일반적이지 않습니다.

+0

해답을 찾아 주셔서 대단히 감사합니다. 내가 편집하고 내 질문에 새 스레드를 추가했습니다. 새 스레드에서 서비스를 올바르게 실행했는지 확인하고 확인할 수 있습니까? 고맙습니다! – YRTM2014

+0

예를 들어, 새 스레드를 시작할 필요가 없습니다. 코드에서 오랫동안 작동하지 않았습니다. 여러분의 서비스에서 쓰레드 지원을 추가하고 싶다면'IntentService'의 [implementation] (https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/IntentService.java)를 확인하십시오. 사실 안드로이드 문서가 권장하는대로 실제로'IntentService'를 사용해야합니다. – alijandro