0

我知道这是一个基本问题,我是 android 服务的新手。我对 Google 和 StackOverflow 进行了研究。stackoverflow 中有很多与我的主题相关或相似的问题,但我无法得到正确的答案,我被转移到不同的主题。

这是我正在运行的简单测试代码。

public class Service extends android.app.Service {

private Handler mHandler;

private void ping() {
    try {
        Log.e("Tag", "Success");
        Toast.makeText(getApplicationContext(), "Service Ping", Toast.LENGTH_SHORT).show();

    } catch (Exception e) {
        Log.e("Error", "In onStartCommand");
        e.printStackTrace();
    }
    scheduleNext();
}

private void scheduleNext() {
    mHandler.postDelayed(new Runnable() {
        public void run() { ping(); }
    }, 3000);
}

public int onStartCommand(Intent intent, int x, int y) {
    mHandler = new android.os.Handler();
    ping();
    return START_STICKY;
}

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

}

在此弹出 Toast 消息并每 3 秒打印一次 Log 消息,即使在应用程序最小化时它也能正常工作。但是当我完全退出应用程序时,没有 Toast 或 Log 打印。在这个SO ANSWER中清楚地说明了为什么在没有 UI 的情况下无法调用 Toast 消息。而且由于进程被杀死,我无法打印 LOG。

基本上,我希望该服务每 5 分钟在后台运行一次,并且需要从在线获取数据。我应该如何实施服务?并且感谢任何示例代码或教程?

4

1 回答 1

0

当您启动服务时,默认情况下,它与启动它的任何组件在同一进程中运行。当该组件运行的进程退出时,Service 也会退出。为了在自己的进程中启动服务,您需要在清单中执行以下操作:

    <service
        android:name=".Service"
        android:enabled="true"
        android:exported="false"
        android:process=":separate_service_process"
        android:stopWithTask="false" >
    </service>

将冒号放在android:process属性标签前面告诉系统在单独的进程中启动服务,并且该android:stopWithTask属性将告诉系统即使启动它的组件停止时也要保持服务处于活动状态。有关清单设置(属性是类的一部分)的更多信息,请参见http://developer.android.com/guide/topics/manifest/service-element.htmlstopWithTaskServiceInfo

现在开始使用你的服务startService(Intent),你应该已经准备好了。祝你好运!

PS-我建议将您的服务类重命名为独特的名称,以避免与基本服务类混淆。

于 2015-03-28T23:35:24.100 回答