我有一个小部件,按下按钮后我发送广播到服务。但我没有收到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
为什么我不接收我的广播?
答案 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中取消注册。 这对我有用。