gpt4 book ai didi

android - 应用程序未打开或关闭时的后台服务

转载 作者:行者123 更新时间:2023-12-04 08:41:23 25 4
gpt4 key购买 nike

我有一个在 firestore 中添加/更新数据的位置服务。当应用程序打开时它工作正常,但如果我强制关闭应用程序或切换到另一个应用程序,该服务将不再工作。我在 Realme 3 pro 设备上对此进行了测试。

  • 即使应用程序在应用程序管理器中关闭,也运行服务。

  • 服务等级
    public class LocationService extends Service {
    private static final String TAG = "SERVICE";
    private LocationManager mLocationManager = null;
    private static final int LOCATION_INTERVAL = 0;
    private static final float LOCATION_DISTANCE = 0;

    private class LocationListener implements android.location.LocationListener {
    Location mLastLocation;

    public LocationListener(String provider) {
    Log.e(TAG, "LocationListener " + provider);
    mLastLocation = new Location(provider);
    }


    @Override
    public void onLocationChanged(Location location) {

    mLastLocation.set(location);
    }

    @Override
    public void onProviderDisabled(String provider) {
    Log.e(TAG, "onProviderDisabled: " + provider);
    }

    @Override
    public void onProviderEnabled(String provider) {
    Log.e(TAG, "onProviderEnabled: " + provider);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    Log.e(TAG, "onStatusChanged: " + provider);
    }
    }

    LocationListener[] mLocationListeners = new LocationListener[]{
    new LocationListener(LocationManager.GPS_PROVIDER),
    new LocationListener(LocationManager.NETWORK_PROVIDER)
    };

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    Log.e(TAG, "onStartCommand");
    super.onStartCommand(intent, flags, startId);
    LocationInitialize();
    return START_STICKY;
    }

    @Override
    public void onCreate() {
    Log.e(TAG, "onCreate");

    }

    public void LocationInitialize(){
    initializeLocationManager();
    try {
    mLocationManager.requestLocationUpdates(
    LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
    mLocationListeners[1]);
    } catch (java.lang.SecurityException ex) {
    Log.i(TAG, "fail to request location update, ignore", ex);
    } catch (IllegalArgumentException ex) {
    Log.d(TAG, "network provider does not exist, " + ex.getMessage());
    }
    try {
    mLocationManager.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
    mLocationListeners[0]);
    } catch (java.lang.SecurityException ex) {
    Log.i(TAG, "fail to request location update, ignore", ex);
    } catch (IllegalArgumentException ex) {
    Log.d(TAG, "gps provider does not exist " + ex.getMessage());
    }
    }

    @Override
    public void onDestroy() {
    Log.e(TAG, "onDestroy");
    super.onDestroy();

    Intent broadcastIntent = new Intent();
    broadcastIntent.setAction("restartservice");
    broadcastIntent.setClass(this, RestartService.class);
    this.sendBroadcast(broadcastIntent);
    }

    private void initializeLocationManager() {
    Log.e(TAG, "initializeLocationManager");
    if (mLocationManager == null) {
    mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
    }
    }

    @Override
    public void onTaskRemoved( Intent rootIntent ) {
    Intent broadcastIntent = new Intent();
    broadcastIntent.setAction("restartservice");
    broadcastIntent.setClass(this, RestartService.class);
    this.sendBroadcast(broadcastIntent);
    }
    }
    广播接收
    public class RestartService extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(new Intent(context, LocationService.class));
    } else {
    context.startService(new Intent(context, LocationService.class));
    }
    }
    }
    Android list
    <receiver
    android:name=".service.RestartService"
    android:enabled="true"
    android:stopWithTask="false"
    android:exported="true">
    <intent-filter>
    <action android:name="restartservice" />
    </intent-filter>
    </receiver>

    <service
    android:name=".service.LocationService"
    android:enabled="true"
    android:exported="true" />

    最佳答案

    According to google developer recent policy you shouldnt be usingmanifest based broadcast receivers , though it will not work above 26SDK


    https://developer.android.com/guide/components/broadcasts#changes-system-broadcasts
    所以不需要使用广播接收器来重启服务。
    使用此代码重新启动服务
    更新的服务类
    public class LocationService extends Service {
    private static final String TAG = "SERVICE";
    private LocationManager mLocationManager = null;
    private static final int LOCATION_INTERVAL = 0;
    private static final float LOCATION_DISTANCE = 0;

    private class LocationListener implements android.location.LocationListener {
    Location mLastLocation;

    public LocationListener(String provider) {
    Log.e(TAG, "LocationListener " + provider);
    mLastLocation = new Location(provider);
    }


    @Override
    public void onLocationChanged(Location location) {

    mLastLocation.set(location);
    }

    @Override
    public void onProviderDisabled(String provider) {
    Log.e(TAG, "onProviderDisabled: " + provider);
    }

    @Override
    public void onProviderEnabled(String provider) {
    Log.e(TAG, "onProviderEnabled: " + provider);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    Log.e(TAG, "onStatusChanged: " + provider);
    }
    }

    LocationListener[] mLocationListeners = new LocationListener[]{
    new LocationListener(LocationManager.GPS_PROVIDER),
    new LocationListener(LocationManager.NETWORK_PROVIDER)
    };

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    Log.e(TAG, "onStartCommand");
    super.onStartCommand(intent, flags, startId);
    LocationInitialize();
    return START_STICKY;
    }

    @Override
    public void onCreate() {
    super.onCreate();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startMyOwnForeground();
    } else {
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "1");
    Notification notification = notificationBuilder.setOngoing(true)
    .setSmallIcon(R.mipmap.ic_launcher)
    .setContentTitle("My service.")
    .setPriority(NotificationManager.IMPORTANCE_MIN)
    .setCategory(Notification.CATEGORY_SERVICE)
    .build();
    startForeground(1, notification);
    }
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    private void startMyOwnForeground() {
    String channelName = "My service";
    NotificationChannel chan = new NotificationChannel("2", channelName, NotificationManager.IMPORTANCE_NONE);
    chan.setLightColor(Color.BLUE);
    chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    assert manager != null;
    manager.createNotificationChannel(chan);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "2");
    Notification notification = notificationBuilder.setOngoing(true)
    .setSmallIcon(R.mipmap.ic_launcher)
    .setContentTitle("My service")
    .setPriority(NotificationManager.IMPORTANCE_MIN)
    .setCategory(Notification.CATEGORY_SERVICE)
    .build();
    startForeground(2, notification);
    }

    public void LocationInitialize(){
    initializeLocationManager();
    try {
    mLocationManager.requestLocationUpdates(
    LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
    mLocationListeners[1]);
    } catch (java.lang.SecurityException ex) {
    Log.i(TAG, "fail to request location update, ignore", ex);
    } catch (IllegalArgumentException ex) {
    Log.d(TAG, "network provider does not exist, " + ex.getMessage());
    }
    try {
    mLocationManager.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
    mLocationListeners[0]);
    } catch (java.lang.SecurityException ex) {
    Log.i(TAG, "fail to request location update, ignore", ex);
    } catch (IllegalArgumentException ex) {
    Log.d(TAG, "gps provider does not exist " + ex.getMessage());
    }
    }

    @Override
    public void onDestroy() {
    Log.e(TAG, "onDestroy");
    super.onDestroy();
    // no need to do anything here
    //Intent broadcastIntent = new Intent();
    //broadcastIntent.setAction("restartservice");
    //broadcastIntent.setClass(this, RestartService.class);
    //this.sendBroadcast(broadcastIntent);
    }

    private void initializeLocationManager() {
    Log.e(TAG, "initializeLocationManager");
    if (mLocationManager == null) {
    mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
    }
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
    Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
    restartServiceIntent.setPackage(getPackageName());

    PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmService.set(
    AlarmManager.ELAPSED_REALTIME,
    SystemClock.elapsedRealtime() + 1000,
    restartServicePendingIntent);

    super.onTaskRemoved(rootIntent);
    }
    }

    关于android - 应用程序未打开或关闭时的后台服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64548282/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com