بسته نشدن سرویس در اندروید 8 به بعد
سلام دوستان.
در حال برنامه نویسی یک اپلیکیشن چت هستیم و همه کارها انجام شده منتها مشکلی که داریم محدودیت سرویس ها در اندروید 8 به بعد هست.
با توجه به محدودیت سرویس ها در اندروید 8 . میخواستم بدونم راهی هست که سرویس های بک گراند توی اندروید 8 به بعد بسته نشه .
البته برامون امکان استفاده از روش های جایگزین زیر نیست :
1- استفاده از foreGroundService به خاطر اینکه مجبوریم نوتیفیکیشن به کاربر نمایش بدیم و کارفرما درخواست داده نوتیفیکیشن وجود نداشته باشه.
2-استفاده از ( WorkManager , JobSchadule) بدلیل اینکه real time نیست و شاید به کار چت اپلیکیشن نیاد و عملا اگر یه کاری رو توی یه دوره خاصی بخوایم تکرار کنیم مناسب باشه که اونم محدودیت تکرار در بازه 15 دقیقه ای رو داره .
نکته ای که هست وقتی سرویسمون رو با startService استارت کنیم . توی اندروید 8 به بعد با خروج از برنامه بعد از گذشت چند ثانیه سرویسمون بسته میشه .و نکته دیگه اینکه طبق تصویر پیوستی وقتی از بخش تنظیمات دستگاه سرویس های در حال اجرا رو مشاهده میکنم بعضی از برنامه ها سرویسشون بسته نشده و در حال اجرا هستند .این برنامه ها چجوری سرویسشون رو بدون نمایش هیچ نوتیفیکیشنی به کاربر اجرا نگه داشتند .

یک نمونه کد خودم
package com.example.arash.myapplication.background;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.annotation.NonNull;
import android.support.v4.app.JobIntentService;
import com.example.arash.myapplication.Tools;
import com.example.arash.myapplication.main.G;
import com.example.arash.myapplication.rss.RssHandler;
import com.treebo.internetavailabilitychecker.InternetAvailabilityChecker;
import com.treebo.internetavailabilitychecker.InternetConnectivityListener;
public class MyService extends JobIntentService implements InternetConnectivityListener {
private static Boolean mustRun=true;
private boolean isConnected;
InternetAvailabilityChecker internetReciver;
public static final int JOB_ID = 0x01;
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, MyService.class, JOB_ID, work);
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
Tools.log("start");
/* G.needRefresh = true;
SharedPreferences.Editor editor = G.sharedPreferences.edit();
editor.putBoolean(G.refresh, G.needRefresh);
editor.commit();*/
mustRun = false;
internetReciver = InternetAvailabilityChecker.init(getApplicationContext());
internetReciver.addInternetConnectivityListener(this);
sync(isNetworkOnline());
}
public static Boolean mustRun() {
return mustRun;
}
public boolean isNetworkOnline() {
boolean status = false;
try {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getNetworkInfo(0);
if (netInfo != null && netInfo.getState() == NetworkInfo.State.CONNECTED) {
status = true;
} else {
netInfo = cm.getNetworkInfo(1);
if (netInfo != null && netInfo.getState() == NetworkInfo.State.CONNECTED)
status = true;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return status;
}
@Override
public void onInternetConnectivityChanged(boolean isConnected) {
this.isConnected = isConnected;
if (!isConnected) {
this.isConnected = isNetworkOnline();
}
Tools.log("TEST");
sync(this.isConnected);
}
private void sync(boolean isConnected) {
Tools.log(isConnected);
if (G.needRefresh) {
if (isConnected) {
Tools.log("worlk");
new RssHandler().execute();
} else {
Tools.log("not work");
if (G.onRefereshFalse != null) {
G.onRefereshFalse.run();
}
}
}
}
}
این متد را فقط فراخوانی کن هر جا خواستی
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, MyService.class, JOB_ID, work);
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .