有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

未从小部件接收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);
    }

在我的服务中

public class ServiceWidgetReceiver extends BroadcastReceiver {

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

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

            }
      }
}

我的舱单是这样的-

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

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

我只拿到日志-

PLAY0
PLAY1

为什么我没有得到我的广播


共 (3) 个答案

  1. # 1 楼答案

    我假设您已经像Myon所说的那样在意图过滤器中实现了操作,但是仍然没有广播到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);
    }
    

    事实上,我昨天也遇到了类似的问题,我的widget在安卓5.1手机上运行良好。然而,我发现它无法在android 7.0索尼手机上执行点击操作。我仍在试图找出是索尼手机操作系统的问题还是安卓7.0或之后的问题,因为在升级7.0或之后,出现了很多不同的问题,因为它们在API中发生了很大的变化。不管怎样,我用的是吊坠。FLAG_UPDATE_CURRENT解决了我在7.0上遇到的问题

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

    <receiver android:name="packageName.ServiceWidgetReceiver">
        <intent-filter>
            <action android:name="PLEASE_PLAY" />
        </intent-filter>
    </receiver>
    
  2. # 2 楼答案

    我发现了我所犯的错误。我必须注册Receiver并在服务本身而不是在清单中注销它。 这对我有用

  3. # 3 楼答案

    您的接收器没有提供意向过滤器的接缝。尝试将其添加到mainfest文件中:

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