تالار گفتمان nCIS.ir

نسخه‌ی کامل: حذف سرویس بعد از پاک کردن حافظه
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
من یه سرویس دارم گه ناتیفکشنهای  رو از سرور دریافت می کنه ....سرویس توی بگراند کار میکنه و مشکلی نداره ولی وقتی حافظه پاک میشه سرویس از  کار می افته ...
باید چیکار کنم که سرویس بعد از پاک شدن حافظه هم باقی بمونه ؟
خوب این اولاً که طراحی خوبی نیست که برنامه خودبخود استارت بشه ولی در جاهایی که نیاز هست، میتونید از راهکارهایی که توی این لینکها گفته استفاده کنید:
http://stackoverflow.com/questions/21550...e-close-it
http://stackoverflow.com/questions/11237...9#11238779

اگه کاربر عمداً برنامه رو با Force Close ببنده بهتره که دیگه سرویس رو استارت نکنید ولی اگه بنا به دلایلی مثل حافظه و... سرویسها نیاز به بستن داشته باشن، میتونید سرویس رو بصورت پیش‌زمینه (نه پس‌زمینه) ایجاد کنید تا در چنین مواقعی اولویت بسته‌شدن با سرویس شما نباشه:
http://stackoverflow.com/questions/63977...-a-service
http://www.truiton.com/2014/10/android-f...ce-example
این لینکها و هرچی لینک توی اینترنت بود گشتم و اجرا کردم ولی هنوز با پاک کردن حافظه سرویس از کار می افته
برنامه های مثل فیس بوک چجوری کار می کنن که همیشه ناتیفکشن ها رو دریافت می کنن ؟
یا همین موزیک پلیرها که با پاک کردن حافظه هم باز  کار میکنن؟
این کدهای من هستش : کدهای بخش  ریستارت شدن سرویس

    @Override
    public void onTaskRemoved(Intent rootIntent){

        Log.i("service","service are killed");
        sendBroadcast(new Intent("YouWillNeverKillMe"));
        Intent restartServiceIntent = new Intent(this, this.getClass());
        restartServiceIntent.setPackage(getPackageName());

        PendingIntent restartServicePendingIntent =  PendingIntent.getService(G.context, 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarmService = (AlarmManager) G.context.getSystemService(G.context.ALARM_SERVICE);
        alarmService.set(
                AlarmManager.ELAPSED_REALTIME,
                SystemClock.elapsedRealtime() +3000,
                restartServicePendingIntent);


        super.onTaskRemoved(rootIntent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        sendBroadcast(new Intent("YouWillNeverKillMe"));
    }


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, final int startId) {

        if (getNotic == null) {
            getNotic=new Timer();
            getNotic.schedule(new TimerTask() {
                @Override
                public void run() {
         get_notic();

                }
            },10*60*1000,10*60*1000);
        }
        return START_STICKY;
    }
اینم هم برود کست

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("service", "onReceive");
        context.startService(new Intent(G.context, backDoor.class));

    }

}
این هم کدهای فایل منیفست

<service android:name=".backDoor"
            android:process=":remote"  >

        </service>
        <receiver android:name="com.oneremind.oneremind.MyBroadcastReceiver">
            <intent-filter>
                <action android:name="YouWillNeverKillMe" >

                </action>
            </intent-filter>
        </receiver>
اگه سرویس رو بصورت Foreground اجرا کنید، با پاک‌شدن حافظه معمولاً بسته نمیشه مگه اینکه ضروری باشه و حافظه گوشی خیلی محدود بشه طوری که در اجرای پردازشهای خود سیستم مشکل پیش بیاره که در اینصورت اپلیکیشنهایی مثل Facebook هم بسته میشن. بعلاوه این سرویسها با Push Notification کار میکنن نه اینکه هر چند لحظه یکبار به سرور درخواست بفرستن. Broadcast Listener رو اگه توی مانیفست تعریف کنید، حتی با بستن برنامه هم کار میکنه (همین کاری که شما انجام دادین). حالا نمیدونم منظورتون از اون intent-filter چی بوده چون نیازی بهش نیست.