آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

بسته نشدن سرویس در اندروید 8 به بعد

hosein2020  8 سال پیش  7 سال پیش
0 0

سلام دوستان.

در حال برنامه نویسی یک اپلیکیشن چت هستیم و همه کارها انجام شده منتها مشکلی که داریم محدودیت سرویس ها در اندروید 8 به بعد هست.

با توجه به محدودیت سرویس ها در اندروید 8 . میخواستم بدونم راهی هست که سرویس های بک گراند توی اندروید 8 به بعد بسته نشه .

البته برامون امکان استفاده از روش های جایگزین زیر نیست  :

1- استفاده از foreGroundService به خاطر اینکه مجبوریم نوتیفیکیشن به کاربر نمایش بدیم و کارفرما درخواست داده نوتیفیکیشن وجود نداشته باشه.

2-استفاده از ( WorkManager , JobSchadule)  بدلیل اینکه real time نیست و شاید به کار چت اپلیکیشن نیاد و عملا اگر یه کاری رو توی یه دوره خاصی بخوایم تکرار کنیم مناسب باشه که اونم محدودیت تکرار در بازه 15 دقیقه ای رو داره .

نکته ای که هست وقتی سرویسمون رو با startService استارت کنیم . توی اندروید 8 به بعد با خروج از برنامه بعد از گذشت چند ثانیه سرویسمون بسته میشه .و نکته دیگه اینکه طبق تصویر پیوستی وقتی از بخش تنظیمات دستگاه سرویس های در حال اجرا رو مشاهده میکنم  بعضی از برنامه ها سرویسشون بسته نشده و در حال اجرا هستند .این برنامه ها چجوری سرویسشون رو بدون نمایش هیچ نوتیفیکیشنی به کاربر اجرا نگه داشتند .

0 0
لینک (8 سال پیش)
0 0
سلام دوست عزیز ممنون از شما . منتها اگر دقت کنید گفتم این روش های جایگزین رو میدونم و لینکی که دادید هم عملا یه کاری رو توی یه بازه خاصی تکرار میکنه که عملا سرویس باز نیست و احتمال داره که توی این بازه نوتیفیکیشن پیام جدید به کاربر نرسه تا زمانی که مجدد اون دستورات تکرار بشن . میخوام بدونم چجوری برنامه هایی که توی تصویر مشخص کردم سرویسشون باز هست. ممنون (8 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
arash  7 سال پیش
0 0

استفاده از job intent service

 

پاسخ به سوال 
arash  7 سال پیش
0 0

یک نمونه کد خودم

 
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();
}
}
}
}
}
پاسخ به سوال 
arash  7 سال پیش
0 0

این متد را فقط فراخوانی کن هر جا خواستی


public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, MyService.class, JOB_ID, work);
}


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .