مشکل در سرویس ها
سلام خسته نباشید
ببخشید من اخیرا نیاز دارم تا یک برنامه ای بسازم که زمانی که 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
I/Test: number is 25
I/Test: number is 26
I/Test: number is 27
I/Test: number is 28
I/Test: number is 29
I/Test: number is 30
I/Test: number is 31
I/Test: number is 32
I/Test: number is 33
I/Test: number is 34
I/Test: number is 35
I/Test: number is 36
I/Test: number is 37
I/Test: number is 38
I/Test: number is 39
همان طور که در کامنت ها می بینید ، سرویس شروع میشه و با توجه به برنامه ، شروع به تولید لاگ می کند ؛ بعد از بستن process برنامه ، مجدد سروریس از اندروید صدا زده می شود و کار می کند ولی چرا مقدار عدد صفر می شود(ضاهرا داده های قبلی سروریس در این حین پاک و صفر می شود) و مجدد بعد از ورود برنامه به روال خودش ادامه می دهد و این مقدار از اول نمی شود...
حالا چگونه می توان این مشکل را حل کرد که بعد از بسته شدن process برنامه ، این مقدار از نو نشود...
این کار بالا امکان پذیر است یا نه؟
اگر واضح توضیح ندادم بگید...
لطفا مشارکت کنید...
سلام
به خاطر این خط از کدتون هست
return TestService.START_STICKY;
در توضیحات این فیلد نوشته شده که در صورت بسته شدن سرویس، سیستم دوباره شروع به راه اندازی سرویس خواهد کرد که این امر موجب می شود متد onStartCommand دوباره فراخوانی شود
درباره اینکه عدد ریست می شود زیرا بعد از بسته شدن اکتیویتی و سرویس سیستم فیلد های مربوطه را از حافظه پاک می کند.
می توانید با استفاده ساده از ShareadPref مقدار را ذخیره و بازخوانی کنید.
بعد از یک سری تحقیقات متوجه شدم کافی است در خود سرویس از این متدد خود ساب کلس استفاده کنم
(بدون محدودیت 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);
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .