如何实现仅在应用程序运行时运行的服务?

时间:2013-08-09 15:58:07

标签: android service

该应用程序有一项服务,必须检测应用程序运行的时间,并根据该服务,该服务将启动misc操作。

实现这个的正确方法是什么?

如果应用程序在用户面前运行,我怎么能确定服务是否正在运行?

启动服务似乎很简单 - 只需在启动加载时启动即可。但更难的部分是结束它。当用户按下最后一个屏幕上的“返回”按钮时,我无法结束它。如何处理用户按主屏幕或其他某个应用程序(如电话,或viber弹出窗口或...)的情况会占用屏幕?

我尝试从其他主题(How to start a android service from one activity and stop service in another activity?)获取建议,但这并不能处理主页按钮或其他应用程序接管屏幕的情况。

该应用程序总共有大约10项活动。这是将这项服务绑定到所有10项活动的正确方法,当所有这些活动都关闭时,服务会自动关闭吗?

2 个答案:

答案 0 :(得分:2)

为您的所有活动制作BaseActivity。在BaseActivity中,执行以下操作:

public class MyActivity extends Activity implements ServiceConnection {

    //you may add @override, it's optional
    protected void onStart() {
        super.onStart();
        Intent intent = new Intent(this, MyService.class);
        bindService(intent, this, 0);
    }

    //you may add @override, it's optional
    protected void onStop() {
        super.onStop();
        unbindService(this);
    }

    public void onServiceConnected(ComponentName name, IBinder binder) {};
    public void onServiceDisconnected(ComponentName name) {};

    /* lots of other stuff ... */
}

您的BaseActivity需要实现ServiceConnection接口(或者您可以使用匿名内部类),但您可以将这些方法留空。

在Service类中,您需要实现onBind(Intent)方法并返回IBinder。最简单的方法是这样:

public class MyService extends Service {
    private final IBinder localBinder = new LocalBinder();

    public void onCreate() {
        super.onCreate();
        // first time the service is bound, it will be created
        // you can start up your timed-operations here
    }

    public IBinder onBind(Intent intent) {
        return localBinder;
    }

    public void onUnbind(Intent intent) {
        // called when the last Activity is unbound from this service
        // stop your timed operations here
    }

    public class LocalBinder extends Binder {

        MyService getService() {
            return MyService.this;
        }
    }
}

答案 1 :(得分:1)

Bound Service是专门为此目的定义的,您可以将活动绑定到它,当所有活动都消失时,它也将被停止。该链接应包含足够的细节供您实施。