مشکل در کار با سرویس ها
سلام خسته نباشید
ببخشید من اخیرا نیاز دارم تا یک برنامه ای بسازم که زمانی که process برنامه بسته می شود ، بتوانم کار های خودم را در پشت صحنه همچنان انجام دهم...
مدتی مطالعه کردن و به Service ها رسیدم و شروع به تست با آن کردم:
نمونه کد من:
public class TestService extends Service {
private static int num = 0;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Log.i("Test", "" + intent);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Log.i("Test", "number is " + num);
num++;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return TestService.START_STICKY;
}
همچنین این سروریس را در مانیفست ذکر کردم و آن را در اکتیویتی مورد نظر ذکر کردم:
<service android:name="test.TestService"/>
startService(new Intent(getApplicationContext(), TestService.class));
و در نتیجه بعد از اجرای برنامه چنین کد هایی چاپ می شود:
I/Test: Intent { cmp=com.android.test.hossein.test_app/test.TestService }//starting service from activity
I/Test: number is 0
I/Test: number is 1
I/Test: number is 2
I/Test: number is 3
I/Test: number is 4
I/Test: number is 5
I/Test: number is 6
I/Test: number is 7
I/Test: number is 8
I/Test: number is 9
I/Test: number is 10
I/Test: number is 11//after exit process
I/Test: null// auto run service
I/Test: number is 0
I/Test: number is 1
I/Test: number is 2
I/Test: number is 3
I/Test: number is 4
I/Test: number is 5
I/Test: number is 6
I/Test: number is 7
I/Test: number is 8
I/Test: number is 9
I/Test: number is 10
I/Test: Intent { cmp=com.android.test.hossein.test_app/test.TestService }//come in app again
I/Test: number is 11
I/Test: number is 12
I/Test: number is 13
I/Test: number is 14
I/Test: number is 15
I/Test: number is 16
I/Test: number is 17
I/Test: number is 18
I/Test: number is 19
I/Test: number is 20
I/Test: number is 21
I/Test: number is 22
I/Test: number is 23
I/Test: number is 24
...
همان طور که در کامنت ها می بینید ، سرویس شروع میشه و با توجه به برنامه ، شروع به تولید لاگ می کند ؛ بعد از بستن process برنامه ، مجدد سروریس از اندروید صدا زده می شود و کار می کند ولی چرا مقدار عدد صفر می شود(ضاهرا داده های قبلی سروریس در این حین پاک و صفر می شود) و مجدد بعد از ورود برنامه به روال خودش ادامه می دهد و این مقدار از اول نمی شود...
حالا چگونه می توان این مشکل را حل کرد که بعد از بسته شدن process برنامه ، این مقدار از نو نشود...
(می دونم که عدد را می توانم ذخیره کنم ولی جواب من این نیست مثلا اگه mediaplayer برای پخش آهنگ باشه ، مثل این ، خواهد شد)
این کار بالا امکان پذیر است یا نه؟
اگر واضح توضیح ندادم بگید...
لطفا مشارکت کنید...
سلام
در اندروید 8 به بعد شما باید از ForgroundService ها استفاده کنید تا اندروید سرویس تون رو نبنده
بعد از یک سری تحقیقات متوجه شدم کافی است در خود سرویس از این متدد خود ساب کلس استفاده کنم
(بدون محدودیت api)
startForeground(int id, Notification notification)
نمونه:
Intent newIntent = new Intent(getBaseContext(), MainActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(),100,newIntent,PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new NotificationCompat.Builder(getBaseContext(), ServiceApplication.CHANNEL_IMPORT)
.setContentTitle("M Service")
.setContentText("now , this app is runing in foreground...")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent)
.build();
startForeground(100,notification);
(ممنون از راهنمایی شما دوست عزیز)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .