我的应用程序已经有一个处理通知的服务,但我需要第二个在后台运行持久监听来自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了解了这个问题。
答案 0 :(得分:0)
由于您要返回START_NOT_STICKY
,Android会在Service
返回后立即停止onStartCommand()
。如果您希望Service
保持活着,则需要从START_STICKY
返回onStartCommand()
。
此外,您的Service
无法随应用自动启动。需要通过调用startService()
启动它。
另外,正如评论中提到的那样,请不要使用new
创建Android组件,如下所示:
MainActivity mainActivity = new MainActivity();
只有Android可以正确地实例化组件Activity
,Service
,BroadcastReceiver
和Provider
,因为他们还需要设置Context
。