我的应用不会调用来自wakefulbroadcastreceiver的intentservice请求
清单:
<service
android:name=".MyWearableListenerService">
<intent-filter>
<action android:name="com.google.android.gms.wearable.DATA_CHANGED" />
<action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED"/>
<data android:scheme="wear" android:host="*"/>
</intent-filter>
</service>
<service
android:name=".CounterActivity$WearableReceiverService"
android:exported="false">
</service>
<receiver
android:name=".CounterActivity$WearableReceiver"
android:enabled="true">
</receiver>
所以我注册所有接收器和服务。
在我的主要活动中我将这些作为主类中的子类,因此我可以在主类msgReqAction()中调用该方法
public class WearableReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, WearableReceiverService.class);
startWakefulService(context, service);
}
}
public class WearableReceiverService extends IntentService {
public WearableReceiverService(){
super("WearableReceiverService");
}
@Override
protected void onHandleIntent(Intent intent) {
msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0));
WearableReceiver.completeWakefulIntent(intent);
}
}
我不认为将这些作为子类应该会阻碍这种情况,但可能会这样。如果我必须在主要课程之外进行操作,请告诉我。
最后,我从主要活动之外的监听器开始整个过程,该监听器侦听来自可穿戴设备的消息
@Override
public void onMessageReceived(final MessageEvent messageEvent) {
nodeId = messageEvent.getSourceNodeId();
String incomingPath = messageEvent.getPath();
int incomingReq = Integer.parseInt(new String(messageEvent.getData()));
if(incomingPath.equalsIgnoreCase(MyConstants.MSG_COUNTER_REQ_PATH)) {
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(MyConstants.BROADCAST_ACTION_RESP);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
broadcastIntent.putExtra(MyConstants.BROADCAST_DATA_REQ, incomingReq);
sendBroadcast(broadcastIntent);
}else if(incomingPath.equalsIgnoreCase(MyConstants.MSG_DEFAULT_PATH)){
}
}
public static final String BROADCAST_ACTION_RESP = "com.example.johnbravado.zionwork.MESSAGE_PROCESSED";
我的项目是com.example.johnbravado.zionwork - 在旁注还有一种方法可以在android studio中轻松更改和重构,以便我可以摆脱示例或完全改变它吗?
当我运行调试器时,系统一直到
startWakefulService(context, service);
然后它在没有进入意向服务的情况下崩溃。是否有一些简单的我在所有这些中缺失,这阻止它进入服务和工作。我能说的最好是它根本不进入服务。我添加了一些服务的介绍行
@Override
protected void onHandleIntent(Intent intent) {
int data;
data = 0;
data++;
msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0));
WearableReceiver.completeWakefulIntent(intent);
}
并尝试在这些行上运行调试点,但它没有到达那里。
答案 0 :(得分:0)
您不能将Service
定义为非静态内部类。
非静态内部类包含对其外部类的引用。这意味着为了创建内部类的新实例,您需要拥有外部类的实例。
当Android尝试启动Service
时,它会尝试创建内部类的新实例。这失败了,因为Android没有要在创建中使用的外部类的实例。
同样的规则适用于BroadcastReceiver
。
解决方案:将所有内部类移动到成熟的类(在他们自己的源文件中)。
答案 1 :(得分:0)
解决方案是消除WakefulfulBroadcastReceiver和辅助IntentService。相反,我使用BroadcastReceiever并直接从Wearable侦听器函数发送广播,并使用它直接在活动中处理数据。
public class WearableReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Intent service = new Intent(context, WearableReceiverService.class);
//startWakefulService(context, service);
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"com.example.johnbravado.zionwork");
wakeLock.acquire();
// Do Work
msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0));
wakeLock.release();
}
}
即使我做的不多,也一定需要唤醒锁。如果我后来决定做更多的工作我就准备好了。我不确定这是唤醒锁的最佳位置,或者从未真正使用它们,但这是另一个话题。
我也删除了清单文件中对额外服务和接收者的引用。现在运作良好