0

该应用程序具有一项服务,该服务必须检测应用程序运行了多少分钟,并基于此,该服务将启动其他操作。

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

我如何才能确保服务仅在应用程序在用户面前运行时才运行?

启动服务似乎很容易 - 只需在启动加载时启动它。但更难的部分是结束它。当用户在最后一个屏幕上按下返回按钮时,我不能结束它。当用户按下主屏幕或其他一些应用程序(如电话、viber 弹出窗口或...)接管屏幕时,如何处理这种情况?

我尝试从另一个主题中获取建议(如何从一个活动启动 android 服务并在另一个活动中停止服务?),但这不能处理主页按钮或其他应用程序接管屏幕的情况。

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

4

2 回答 2

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;
        }
    }
}
于 2013-08-09T16:15:07.093 回答
1

Bound Service是专门为这个目的而定义的,你可以将Activities绑定到它,当所有的Activity都消失时,它也会被停止。该链接应包含足够的详细信息供您实施。

于 2013-08-09T16:14:51.480 回答