WakefulBroadcastReceiver startWakefulService无法继续

时间:2016-12-29 12:37:11

标签: android android-intent android-service wear-os android-broadcastreceiver

我的应用不会调用来自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);
}

并尝试在这些行上运行调试点,但它没有到达那里。

2 个答案:

答案 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();
    }
}

即使我做的不多,也一定需要唤醒锁。如果我后来决定做更多的工作我就准备好了。我不确定这是唤醒锁的最佳位置,或者从未真正使用它们,但这是另一个话题。

我也删除了清单文件中对额外服务和接收者的引用。现在运作良好