首页 文章

在销毁应用程序时停止服务

提问于
浏览
8

我现在很困惑,关于运行和停止的服务概念:

我想做的事:

  • 在应用程序一开始就启动位置服务 .

  • 继续获取位置更新,并将 store 获取为共享首选项

  • onDestroy of Application scope! 停止服务

到目前为止,我已经搜索和研究过我们只能做服务的事情(如果我错了,请纠正我):

  • 通过将服务绑定到相关的活动/片段/视图来自动停止服务,当它们全部销毁服务时自动取消绑定,这样我们就可以在unbind中调用 stopself 方法

  • 在onStartCommand中返回START_NOT_STICKY以告诉操作系统,不重新创建它,并创建意图本地服务,在完成某些工作后它将自行销毁 .

  • 通过在某种静态范围内声明它的意图并在应用程序类的 onActivityDestroyed 上停止服务来手动停止服务[我不确定会发生什么? ,每次活动被销毁时,服务会破坏吗?或者它只会在整个应用程序被销毁时销毁?]

无论哪种方式,我有点困惑和打败,一直试图调整我的 Location service 与给定的细节2天

5 回答

  • 2

    首先,在您的应用开始时启动“LocationService”:

    public class MyApp extends Application {
    
        private static final String TAG = "MyApp";
    
        @Override
        public void onCreate() {
            super.onCreate();
            Log.d(TAG, "App started up");
            startService(new Intent(this, MyLocationService.class));
        }
    }
    

    第二:正如你所说,服务应该更好地运行“START_NOT_STICKY”标志

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

    THRID:

    一旦系统杀死你的应用程序,服务将自动被杀死,所以没有任何问题 .

    Application对象上没有 onDestroy() 方法,唯一类似的事件是 onTerminated() ,并且它没有在 生产环境 设备上启动 .

    onTerminate在API级别1中添加void onTerminate()此方法用于模拟的流程环境 . 永远不会在 生产环境 Android设备上调用它,只需杀死它们即可删除进程;这样做时不会执行任何用户代码(包括此回调) .

    更多信息:https://developer.android.com/reference/android/app/Application.html#onTerminate()

    顺便说一句,如果你希望MyLocationService将位置的更新发送到你的应用程序(当它打开时),你应该考虑使用Otto或EventBus(我推荐你最后一个因为使用它的简单性) . 如果需要,您甚至可以将@Suscriber配置为接收旧检索位置的更新 .

  • 2

    如果您使用 START_NOT_STICKY 启动服务,那么一旦您的整个应用程序从后台关闭,您的应用程序将终止您的服务,即您从主屏幕清除了您的应用程序 .

    这里 START_NOT_STICKY 表示你不需要重新创建服务以防它被杀死 .

    如果不是这种情况,那么你必须自己手动杀死它 .

    喜欢

    Intent lintent = new Intent(context, LocationService.class);
    context.stopService(lintent);
    

    您可以在应用程序终止时使用此代码 .

    而已 . 你很高兴与此同行 .

  • 0

    我将尝试以最简单的方式解释:)有两种类型的服务 IntentServiceService IntentService 一旦它处理了 onHandleIntent 方法的内容就会自杀一样 Service 这个不会结束直到你给它命令即使您使用活动的上下文启动它,也要这样做 . 当应用程序在极端情况下停止时(通过系统(设置/应用程序/ YourApp /停止应用程序或应用程序崩溃),它也将停止

  • 0

    最简单的方法首先在一些重复时间(10分钟)启动带有AlarmManager的IntentService,然后在onHandleIntent()中获取Location和store .

    无需绑定到您的活动,IntentService会在保存在首选项后自动停止 .

  • -1

    是的,您可以在活动的onDestroy()中停止服务:

    @Override
    public void onDestroy(){
    Log.v("SERVICE","Service killed");
    service.stop();
    super.onDestroy();
    

    }

相关问题