Android服务无法保持活跃

时间:2015-05-26 15:54:22

标签: java android service android-studio android-service

我的应用程序已经有一个处理通知的服务,但我需要第二个在后台运行持久监听来自Pebble智能手表的传入数据的服务。

但是,出于某种原因,即使该服务在Android清单中声明并将随应用程序启动,它也会立即永久关闭。

我真的不想使用前台服务,因为我觉得我不应该这样做。有很多服务在Facebook和Music Boss等持久的时尚背景中悄然运行。

服务正在主要活动的onCreate中启动,为什么我的服务会被立即杀死?

来自PebbleService.java:

package net.thevgc.quotes;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;

import com.getpebble.android.kit.PebbleKit;
import com.getpebble.android.kit.util.PebbleDictionary;

import java.util.UUID;

public class PebbleService extends Service {
    private PebbleKit.PebbleDataReceiver appMessageReciever;
    private static final int KEY_AUTHOR = 1;
    private static final int KEY_QUOTE = 0;
    private static final UUID WATCHAPP_UUID = UUID.fromString("18451441-8451-4418-4514-418451441845");

    public void onCreate() {
        super.onCreate();
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        String[] extras = (String[]) intent.getSerializableExtra("data");
        final String quote = extras[0];
        final String author = extras[1];

        // Define AppMessage behavior
        if (appMessageReciever == null) {
            appMessageReciever = new PebbleKit.PebbleDataReceiver(WATCHAPP_UUID) {

                @Override
                public void receiveData(Context context, int transactionId, PebbleDictionary data) {
                    // Always ACK
                    PebbleKit.sendAckToPebble(context, transactionId);

                    // Send KEY_QUOTE to Pebble
                    PebbleDictionary out = new PebbleDictionary();
                    out.addString(KEY_QUOTE, mainActivity.quote[0]);
                    out.addString(KEY_AUTHOR, mainActivity.quote[1]);
                    PebbleKit.sendDataToPebble(getApplicationContext(), WATCHAPP_UUID, out);
                }
            };

            // Add AppMessage capabilities
            PebbleKit.registerReceivedDataHandler(this, appMessageReciever);
        }

        return START_STICKY;
    }

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

来自AndroidManifest.xml:

<service
        android:enabled="true"
        android:name="PebbleService" />

UPDATE:显然服务正在某个地方运行,因为我在代码中摆弄了一些,现在我得到一个空指针,但只有当我关闭主要活动时。我很确定它正在重新启动,无法从主要活动中找到所需的额外数据,因为这不是启动它的意图。这意味着我仍然需要使用MainActivity mainActivity = new MainActivity();来获取我需要的字符串数据。

更新2:好吧,我觉得造成这种混乱真的很糟糕。服务 正在运行,但它未显示在我的设置中&gt;应用&gt;运行列表,即使在父活动下也是如此。我知道它正在运行,因为它最终勾选了应该做的事情。猜测弱蓝牙连接。话虽这么说,我仍在抛出NullPointerException,当前代码试图接收意图附加内容。不过我已经opened a new thread了解了这个问题。

1 个答案:

答案 0 :(得分:0)

由于您要返回START_NOT_STICKY,Android会在Service返回后立即停止onStartCommand()。如果您希望Service保持活着,则需要从START_STICKY返回onStartCommand()

此外,您的Service无法随应用自动启动。需要通过调用startService()启动它。

另外,正如评论中提到的那样,请不要使用new创建Android组件,如下所示:

MainActivity mainActivity = new MainActivity();

只有Android可以正确地实例化组件ActivityServiceBroadcastReceiverProvider,因为他们还需要设置Context