未从小部件收到Android广播

时间:2017-03-10 13:36:28

标签: java android

我有一个小部件,按下按钮后我发送广播到服务。但我没有收到onReceive()中的任何广播。

我的意图基本上是在widget按钮点击,它通过服务来执行一些动作。 但是我无法从服务中的小部件接收任何广播。

这是我的小部件代码 -

@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                         int[] appWidgetIds) {
        RemoteViews remoteViews;
        ComponentName componentName;

        remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        componentName = new ComponentName(context, MyWidgetProvider.class);

        remoteViews.setOnClickPendingIntent(R.id.play,getPendingSelfIntent(context, "PLAY",componentName));

        appWidgetManager.updateAppWidget(componentName, remoteViews);
    }

    @Override
    public void onReceive(Context context, Intent intent)
    {
        super.onReceive(context, intent);
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        RemoteViews remoteViews;
        ComponentName componentName;

        remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        componentName = new ComponentName(context, MyService.class);

        if (intent.getAction().equals("PLAY")) {
            Log.d("hi","PLAY0");
            remoteViews.setOnClickPendingIntent(R.id.engine_lock_unlock,getPendingSelfIntent(context,"PLAY",componentName));
            serviceIntent = new Intent(context,MyService.class);

            serviceIntent.setAction("PLEASE_PLAY");
            Log.d("hi","PLAY1");
            context.sendBroadcast(serviceIntent);
        }


        appWidgetManager.updateAppWidget(componentName, remoteViews);
    }

    protected PendingIntent getPendingSelfIntent(Context context, String action, ComponentName componentName) {
        Intent intent = new Intent(context, MyWidgetProvider.class);
        intent.setAction(action);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, componentName);
        return PendingIntent.getBroadcast(context, 0, intent, 0);
    }

在MyService中,

public class ServiceWidgetReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
        Log.d("hi","PLAY2");

            if (intent.getAction().equals("PLEASE_PLAY")) {

            }
      }
}

我的MAnifest看起来像这样 -

<receiver android:name=".widget.MyWidgetProvider" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>

    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/homescreen_widget_preview" />
</receiver>
<receiver android:name=".service.MyService$ServiceWidgetReceiver" />

我只收到日志 -

PLAY0
PLAY1

为什么我不接收我的广播?

3 个答案:

答案 0 :(得分:0)

您的接收器没有提供意图过滤器的接缝。尝试在mainfest文件中添加:

<receiver android:name=".service.MyService$ServiceWidgetReceiver">
    <intent-filter>
        <action android:name="PLEASE_PLAY" />
    </intent-filter>
</receiver>

答案 1 :(得分:0)

我假设您已经像在Myon中那样实现了intent-filter中的操作,但仍然没有向onReceive广播。你可以试试这个:

protected PendingIntent getPendingSelfIntent(Context context, String action, ComponentName componentName) {
    Intent intent = new Intent(context, MyWidgetProvider.class);
    intent.setAction(action);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, componentName);

    //this line replace the original
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

实际上,我昨天面临类似的问题,我的小部件在我的Android 5.1手机上工作正常。但是,我发现它无法执行点击android 7.0索尼手机。我仍然试图找出是否是sony手机操作系统问题或Android 7.0或之后的问题,因为在7.0或之后的升级之后,出现了很多不同的问题,因为它们在API中发生了很大的变化。无论如何,我使用PendingIntent.FLAG_UPDATE_CURRENT解决了我在7.0上遇到的问题

我只是认为会直接注册接收器类来表明这样的工作。绑定的服务不直接影响接收,因为影响接收器的唯一因素是上下文。所以,也许只是接收类就足够了。

<receiver android:name="packageName.ServiceWidgetReceiver">
    <intent-filter>
        <action android:name="PLEASE_PLAY" />
    </intent-filter>
</receiver>

答案 2 :(得分:0)

我发现了我正在做的错误。我必须注册接收器并在服务本身而不是在Manifest中取消注册。 这对我有用。