Android 服务一直在运行吗?

Android 服务一直在运行吗?,android,android-service,android-broadcast,android-background,battery-saver,Android,Android Service,Android Broadcast,Android Background,Battery Saver,我正在努力学习服务和广播接收器。 下面的代码是一个始终在后台运行的服务。问题是我不知道它会如何影响电池的消耗 我的目标是检测屏幕的打开和关闭,所以当应用程序关闭或打开时,我需要在后台运行服务 它会消耗大量电池电量吗? 你能解释一下吗 多谢各位 public class MyService extends Service{ private static final String TAG = "MyService"; private BroadcastReceiver mScree

我正在努力学习服务和广播接收器。 下面的代码是一个始终在后台运行的服务。问题是我不知道它会如何影响电池的消耗

我的目标是检测屏幕的打开和关闭,所以当应用程序关闭或打开时,我需要在后台运行服务

它会消耗大量电池电量吗? 你能解释一下吗

多谢各位

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);
    }
}

在您的代码示例中,服务没有执行某些消耗电池的操作(密集计算、网络请求等)。所以就我个人而言,我认为你的服务会消耗大量的电池不是很明显。但该服务在启动后会保留,这意味着你的应用程序将占用更多内存。在某种程度上,我认为大内存应用程序将占用更多的系统电池,系统需要做更多的额外工作以保持整体性能处于良好状态,这些额外工作需要CPU、IO和内存的计算和读/写周期,这些都会消耗电池

您的服务中没有启动新线程,这意味着您的服务的所有工作都将在主线程上运行。这样,如果您执行长时间的操作而阻塞UI,则极有可能导致ANR。在您的示例中,您只需启动通知并注册广播接收器,您的应用程序运行平稳,并且没有抱怨ANR,因为这两个操作很快就会完成。但你应该意识到这一点


就个人而言,如果您将您的
BroadcastReceiver
放在
AndroidManifest.xml
中可能会更好,这与您的做法不同。

感谢您编辑Wilfred Hughes。我非常感谢你的回答。我在问题中编辑并添加了新的线程。你能检查一下我是否在一个新的线程中正确运行服务吗?非常感谢。在您的示例中,不需要启动新线程,代码中没有执行长时间操作。如果要在服务中添加线程支持,请检查
IntentService
的。实际上,正如android官方文档所建议的那样,大多数情况下您都应该使用
IntentService