安卓服务需要始终运行(永不暂停或停止)

2022-08-31 13:50:36

我创建了一个服务,并希望始终运行此服务,直到我的手机重新启动或强制关闭。该服务应在后台运行。

已创建服务和启动服务的示例代码:

启动服务:

Intent service = new Intent(getApplicationContext(), MyService.class);
getApplicationContext().startService(service);

服务:

public class MyService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO do something useful
        HFLAG = true;
        //smsHandler.sendEmptyMessageDelayed(DISPLAY_DATA, 1000);
        return Service.START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO for communication return IBinder implementation
        return null;
    }
}

舱单声明:

<service
    android:name=".MyService"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
</service>

是否可以在应用程序暂停时始终运行此服务以及其他任何内容。一段时间后,我的应用程序暂停,服务也会暂停或停止。那么我该如何在后台运行此服务并始终运行。


答案 1

“是否可以在应用程序暂停时始终运行此服务以及其他任何操作?”

是的。

  1. 在服务 onStartCommand 方法中,返回START_STICKY。

    public int onStartCommand(Intent intent, int flags, int startId) {
            return START_STICKY;
    }
    
  2. 使用 startService(MyService) 在后台启动该服务,以便无论绑定的客户端数量如何,它始终保持活动状态。

    Intent intent = new Intent(this, PowerMeterService.class);
    startService(intent);
    
  3. 创建活页夹。

    public class MyBinder extends Binder {
            public MyService getService() {
                    return MyService.this;
            }
    }
    
  4. 定义服务连接。

    private ServiceConnection m_serviceConnection = new ServiceConnection() {
            public void onServiceConnected(ComponentName className, IBinder service) {
                    m_service = ((MyService.MyBinder)service).getService();
            }
    
            public void onServiceDisconnected(ComponentName className) {
                    m_service = null;
            }
    };
    
  5. 使用绑定服务绑定到服务。

            Intent intent = new Intent(this, MyService.class);
            bindService(intent, m_serviceConnection, BIND_AUTO_CREATE);
    
  6. 对于您的服务,您可能需要一个通知,以便在关闭活动后启动相应的活动。

    private void addNotification() {
            // create the notification
            Notification.Builder m_notificationBuilder = new Notification.Builder(this)
                    .setContentTitle(getText(R.string.service_name))
                    .setContentText(getResources().getText(R.string.service_status_monitor))
                    .setSmallIcon(R.drawable.notification_small_icon);
    
            // create the pending intent and add to the notification
            Intent intent = new Intent(this, MyService.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
            m_notificationBuilder.setContentIntent(pendingIntent);
    
            // send the notification
            m_notificationManager.notify(NOTIFICATION_ID, m_notificationBuilder.build());
    }
    
  7. 您需要修改清单才能在单顶模式下启动活动。

              android:launchMode="singleTop"
    
  8. 请注意,如果系统需要资源,并且您的服务不是很活跃,则可能会被终止。如果这是不可接受的,请使用 startForeground 将服务带到前台。

            startForeground(NOTIFICATION_ID, m_notificationBuilder.build());
    

答案 2

为了在服务自己的进程中启动服务,必须在 xml 声明中指定以下内容。

<service
  android:name="WordService"
  android:process=":my_process" 
  android:icon="@drawable/icon"
  android:label="@string/service_name"
  >
</service> 

在这里,您可以找到一个对我非常有用的好教程

http://www.vogella.com/articles/AndroidServices/article.html

希望这有帮助


推荐