Как избежать Killing Background Service Даже приложение убивается в Зефир? - PullRequest
0 голосов
/ 31 января 2019

Я хочу создать приложение для Android, чтобы отслеживать местоположение в реальном времени с помощью сервиса Android.Но когда я убил приложение из недавнего списка приложений, сервис также убил в Android 6 (Huawei y3 2017).Но тот же код работает на Android 8. Пожалуйста, помогите мне решить мою проблему.Ниже приведен мой код.

Я добавил флаги START_STICKY и START_REDELIVER_INTENT в методе onStartCommand.

Я попытался перезапустить службу в методе onTaskRemoved.

Попытался добавить андроид: атрибут процесса

Manifest.xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Login" />
    <activity android:name=".Home" />

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

Вот так запускается моя служба в разделе Домашняя активность

Intent intent = new Intent(Home.this, TrackingService.class);
startService(intent);

Файл службы TrackingService.java

@Override
public void onCreate(){
    buildNotification();

    requestLocationUpdates();

    Toast.makeText(getBaseContext(), "Service Started", Toast.LENGTH_SHORT).show();

    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId){
   return START_STICKY;
}

private void buildNotification() {
    Random random = new Random();
    int m = random.nextInt(9999 - 1000) + 1000;

    String stop = "stop";
    registerReceiver(stopReceiver, new IntentFilter(stop));
    PendingIntent broadcastIntent = PendingIntent.getBroadcast(this, 0, new Intent(stop), PendingIntent.FLAG_UPDATE_CURRENT);

    Notification.Builder builder = new Notification.Builder(this)
            .setContentTitle(getString(R.string.app_name))
            .setContentText(getString(R.string.tracking_enabled_notif))
            .setOngoing(true)
            .setContentIntent(broadcastIntent);

    startForeground(m, builder.build());
}

protected BroadcastReceiver stopReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
          unregisterReceiver(stopReceiver);

          stopSelf();
    }
};

private void requestLocationUpdates() {
    LocationRequest request = new LocationRequest();

    request.setInterval(15000);

    request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(this);

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    final DatabaseReference ref = FirebaseDatabase.getInstance().getReference("connected/"+user.getUid());

    int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);

    if (permission == PackageManager.PERMISSION_GRANTED) {
        client.requestLocationUpdates(request, new LocationCallback() {

        @Override
            public void onLocationResult(LocationResult locationResult) {
                android.location.Location location = 
                locationResult.getLastLocation();

                String lat = Double.toString(location.getLatitude());
                String lng = Double.toString(location.getLongitude());

                Toast.makeText(getBaseContext(), "Lat "+lat, Toast.LENGTH_SHORT).show();

                if (location != null) {
                    ref.setValue(locationObj);
                }
               enter code here}
            }, null);
        }
    }

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Попытайтесь зарегистрировать ваш вещательный приемник в своей основной деятельности вместе с намеренными действиями, которые вы хотите, чтобы ваш приемник делал так

private void RegisteringBroadcastReciever()
{
   broadcastReceiver = new XYZIntentReceiver();
   var filter = new IntentFilter();
   filter.AddAction("hearing.arc.intent.action.action1");
   filter.AddAction("hearing.arc.intent.action.action2");
   filter.AddAction("hearing.arc.intent.action.action3");
   filter.AddAction("hearing.arc.intent.action.action4");           
   AppInstance.ApplicationContext.RegisterReceiver(broadcastReceiver, filter);
} 

Даже у меня была похожая проблема.Но у меня была такая проблема на устройствах Oreo.Но это исправление решило мою проблему.И Android просит отменить регистрацию этого приемника в методе onDestroy ().Но не делай этого.Это может снова убить службу.

Надеюсь, это поможет.

0 голосов
/ 31 января 2019

То, что ваш сервис не убит на Android 8, звучит как удача.Возможно, ваш телефон Android 8 имеет достаточно ресурсов и поддерживает службу, но она рано или поздно будет убита.

Чтобы достичь цели, вам нужно запустить службу на переднем плане.Ознакомьтесь с официальной документацией :

Службу переднего плана следует использовать только тогда, когда вашему приложению необходимо выполнить задачу, которая заметна для пользователя, даже если они не взаимодействуют напрямую сприложение.По этой причине службы переднего плана должны показывать уведомление в строке состояния с приоритетом PRIORITY_LOW или выше, что помогает гарантировать, что пользователь знает о том, что делает ваше приложение.Если действие имеет достаточно низкое значение, что вы хотите использовать уведомление с минимальным приоритетом, вам, вероятно, не следует использовать службу;вместо этого рассмотрите возможность использования запланированного задания.

Каждое приложение, которое запускает службу, создает дополнительную нагрузку на систему, потребляя системные ресурсы.Если приложение пытается скрыть свои службы с помощью уведомлений с низким приоритетом, это может ухудшить производительность приложения, с которым пользователь активно взаимодействует.По этой причине, если приложение пытается запустить службу с уведомлением с минимальным приоритетом, система вызывает поведение приложения в нижнем разделе ящика уведомлений.

...