服务停止应用程序最近清除

3

我在处理一个应用程序,我正在创建一个能够在后台执行一些操作的服务。当我从最近打开的应用程序中清除我的应用程序时,这个服务会停止运行。我希望即使我清除了应用程序,我的服务仍然可以在后台运行。我正在使用小米Mi4i设备测试我的应用程序。

这是我的服务类:

public class LocalNotificationService extends Service {

private int i = 1;
public static final String TAG = LocalNotificationService.class.getSimpleName();
private static long UPDATE_INTERVAL = 1 * 5 * 1000;  //default
private static Timer timer = new Timer();
private static final String TIME_FORMAT_LOCAL_NOTIFICATION = "HH:mm";
private boolean isNotificationFired = false;



@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public void onCreate() {
    super.onCreate();
    _startService();
    startForeground(1,new Notification());
    Log.v(TAG, "service created....");

}


private void _startService() {

    timer.scheduleAtFixedRate(

            new TimerTask() {

                public void run() {

                    doServiceWork();
                }
            }, 1000, UPDATE_INTERVAL);
}


private void doServiceWork() {

    Log.v(TAG, "service working....");

    try {

        new AsyncTask<Void, Void, Void>() {

            @Override
            protected Void doInBackground(Void... params) {

                String dateString = null;

                try {

                    String format = "yyyy-MM-dd";
                    final SimpleDateFormat sdf = new SimpleDateFormat(format);
                    dateString = sdf.format(new Date()) + "T00:00:00";
                    Log.v(TAG, dateString);

                } catch (Exception e) {

                    e.printStackTrace();

                }


                List<AppointmentModel> list = new RushSearch().whereEqual("Date", dateString).find(AppointmentModel.class);

                if (list != null & list.size() > 0) {

                    for (AppointmentModel model : list) {

                        try {

                            if (model.Status.equalsIgnoreCase("Confirmed")) {

                                SimpleDateFormat sdf = new SimpleDateFormat(LocalNotificationService.TIME_FORMAT_LOCAL_NOTIFICATION);
                                Date currentTime = sdf.parse(sdf.format(Calendar.getInstance().getTime()));
                                String From = DateAndTimeUtil.getTimeLocale_HHmm(model.FromTime);
                                Date FromTime = sdf.parse(From);

                                long difference = currentTime.getTime() - FromTime.getTime();
                                int days = (int) (difference / (1000 * 60 * 60 * 24));
                                int hours = (int) ((difference - (1000 * 60 * 60 * 24 * days)) / (1000 * 60 * 60));
                                int min = (int) (difference - (1000 * 60 * 60 * 24 * days) - (1000 * 60 * 60 * hours)) / (1000 * 60);
                                hours = (hours < 0 ? -hours : hours);

                                Log.v("======= days", " :: " + days);
                                Log.v("======= hours", " :: " + hours);
                                Log.v("======= min", " :: " + min);


                                switch (min){

                                    case -15: {

                                        if(!isNotificationFired){

                                            Bundle bundle = new Bundle();
                                            bundle.putString(ArkaaNotificationHandler.NOTIFICATION_KEY_FROM, "Appointment Reminder");
                                            bundle.putString(ArkaaNotificationHandler.NOTIFICATION_KEY_TITLE, "Appointment Reminder");
                                            bundle.putString(ArkaaNotificationHandler.NOTIFICATION_KEY_MESSAGE, "You Have Appointment With " + model.Doctor.Name + "At " + DateAndTimeUtil.getTimeLocale_HHmmaa(From));
                                            bundle.putString(ArkaaNotificationHandler.NOTIFICATION_KEY_COLLAPSE_KEY, "");
                                            ArkaaNotificationHandler.getInstance(LocalNotificationService.this).createSimpleNotification(LocalNotificationService.this, bundle);
                                            isNotificationFired = true;

                                        }
                                        break;
                                    }

                                    case -5: {

                                        if(!isNotificationFired){

                                            Bundle bundle = new Bundle();
                                            bundle.putString(ArkaaNotificationHandler.NOTIFICATION_KEY_FROM, "");
                                            bundle.putString(ArkaaNotificationHandler.NOTIFICATION_KEY_COLLAPSE_KEY, "");
                                            bundle.putString(ArkaaNotificationHandler.NOTIFICATION_KEY_MESSAGE, "You Have Appointment With" + model.Doctor.Name + "At" + DateAndTimeUtil.getTimeLocale_HHmmaa(From));

                                            if(NetworkUtils.getNetworkClass(ArkaaApplicationClass.getInstance().getBaseContext()).equalsIgnoreCase("2G")){
                                                bundle.putString(ArkaaNotificationHandler.NOTIFICATION_KEY_TITLE, "For Better Call Experience Please Switch To High BandWidth Network ");
                                            }else{
                                                bundle.putString(ArkaaNotificationHandler.NOTIFICATION_KEY_TITLE, "Appointment Reminder");
                                            }
                                            ArkaaNotificationHandler.getInstance(LocalNotificationService.this).createSimpleNotification(LocalNotificationService.this, bundle);
                                            isNotificationFired = true;

                                        }
                                    }
                                    case -4:
                                    case -14:
                                        isNotificationFired = false;
                                        break;
                                }
                            }
                        } catch (Exception e) {

                            e.printStackTrace();

                        }
                    }
                }
                return null;
            }
        }.execute();
    } catch (Exception e) {

        Log.v(TAG, e.toString());

    }
}

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

@Override
public void onTaskRemoved(Intent rootIntent) {
   stopSelf();
}


private void _shutdownService() {

    if (timer != null) timer.cancel();
    Log.i(getClass().getSimpleName(), "Timer stopped...");

}

@Override
public void onDestroy() {
    super.onDestroy();

    _shutdownService();

    Log.v(TAG, "service destroyed.....");

    // if (MAIN_ACTIVITY != null)  Log.d(getClass().getSimpleName(), "FileScannerService stopped");
}

}


你需要使用前台服务 http://stackoverflow.com/questions/24839655/how-to-use-startforeground/24839801#24839801 - Ravi Shanker Yadav
已经完成了,但问题仍然存在。 - vickyVick
尝试在您的服务的 onStartCommand(...) 函数中返回 START_STICKY - Neo
2个回答

0

0
在您的Activity中,按照以下步骤启动服务。例如,在onCreate()方法中:
Intent intent = new Intent(this, MyService.class);
startService(intent);

在您的服务中,在onCreate()方法中执行以下操作:
    int NOTIFICATION_ID = 2707;
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

    Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    builder.setSmallIcon(android.R.drawable.ic_menu_info_details)
       .setContentTitle("MyAppName")
       .setContentText("the service is running!")
       .setTicker("the service is running!")
       .setOnlyAlertOnce(true)
       .setOngoing(true)
       .setSound(alarmSound);

    Notification notification = builder.build();

    startForeground(NOTIFICATION_ID, notification);

您的通知似乎没有将setOngoing设置为true。 - Carsten Drösser
仍然面临问题 - vickyVick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接