Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – Widget onUpdate在重启后没有在按钮点击时设置pendingIntent大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个测试小部件,通过单击其按钮显示随机数.一切都在我的提供者的onupdate内独立,包括pendingIntent.它工作正常,但重新启动手机后view.setOnClickPendingIntent不工作然RemoteViews重新创建没有问题但按钮变得无响应.

public class TestWidget extends appwidgetprovider {
    static HashMap<Integer,BroadcastReceiver> br = new HashMap<>();

    static void updateAppWidget(Context context,final AppWidgetManager appWidgetManager,final int appWidgetId) {
        context = context.getApplicationContext();
        final RemoteViews views = new RemoteViews(context.getPackagename(),R.layout.@R_618_9214@widget);

        BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context,Intent intent) {
                views.setTextViewText(R.id.appwidget_text,Math.random() + "");
                appWidgetManager.updateAppWidget(appWidgetId,views);
            }
        };
        br.put(appWidgetId,broadcastReceiver);//to unregister later

        Intent intent = new Intent("action");
        IntentFilter intentFilter = new IntentFilter("action");

        context.registerReceiver(broadcastReceiver,intentFilter);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,123,intent,PendingIntent.FLAG_updatE_CURRENT);
        views.setOnClickPendingIntent(R.id.appwidgeT_Button,pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetId,views);
    }

    @Override
    public void onupdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds) {
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context,appWidgetManager,appWidgetId);
        }
    }

    @Override
    public void ondeleted(Context context,int[] appWidgetIds) {
        for (int appWidgetId : appWidgetIds) {
            context.unregisterReceiver(br.get(appWidgetId));
        }
    }
}

表现:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://scheR_753_11845@as.android.com/apk/res/android"
    package="com.aeza.sta">
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <application
        android:allowBACkup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@String/app_name"
        android:rounDicon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <receiver android:name=".TestWidget" android:enabled="true" android:exported="false" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_updatE" />
                <action android:name="android.intent.action.bOOT_COMPLETED" />
            </intent-filter>

            <Meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/@R_618_9214@widget_info" />
        </receiver>

        <activity android:name=".TestWidgetConfigureActivity">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_CONfigURE" />
            </intent-filter>
        </activity>
    </application>

</manifest>

解决方法

appwidgetprovider中动态注册BroadcastReceivers是一个不稳定的解决方案. appwidgetprovider本身是一个BroadcastReceiver,并且在应用程序清单中静态注册的实例意味着相当短暂.

但是,由于appwidgetprovider一个BroadcastReceiver,我们可以利用它,只需在点击PendingIntents中定位你的TestWidget.我们还可以在这里附加Widget ID作为Intent的额外内容,因此我们会在点击触发时更新正确的ID.例如:

Intent intent = new Intent(context,TestWidget.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,appWidgetId,PendingIntent.FLAG_updatE_CURRENT);
views.setOnClickPendingIntent(R.id.appwidgeT_Button,pendingIntent);

请注意,我们还将appWidgetId用于PendingIntent的requestCode.为每个Widget实例使用不同的PendingIntent非常重要,以免错误的Widget实例使用错误的附加内容进行更新.使用已经独特的Widget ID可以让我们轻松完成.

然后我们覆盖TestWidget的onReceive()方法,并检查Intent的动作以确定这是我们的点击广播,还是从系统广播的普通Widget事件.在上面的示例中,我们没有设置操作,因此我们只需在此处检查null.但是,您当然可以指定一个操作字符串,在某些情况下最好这样做;例如,如果您的Widget中有多个按钮,并且需要区分其点击广播.

@Override
public void onReceive(Context context,Intent intent) {
    if (intent.getAction() == null) {
        int appWidgetId = intent.getIntextra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1);
        if (appWidgetId != -1) {
            updateWidgetText(context,Math.random() + "");
        }
    }
    else {
        super.onReceive(context,intent);
    }
}

在上面,你可以看到,如果我们发现它不是我们的,我们将广播传递给超级方法.然后,appwidgetprovider的onReceive()将检查Intent,并按照惯例委托给相应的事件方法.

除了是一个稳定的解决方案之外,这种方法还有另外一个结果,即不需要为每个Widget实例创建,注册和注销单独的BroadcastReceiver实例.然我们添加一个onReceive()方法,但我们可以删除所有动态的BroadcastReceiver代码,因此我们的TestWidget类仍然@R_182_10584@.

public class TestWidget extends appwidgetprovider {

    @Override
    public void onReceive(Context context,Intent intent) {
        if (intent.getAction() == null) {
            int appWidgetId = intent.getIntextra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1);
            if (appWidgetId != -1) {
                updateWidgetText(context,Math.random() + "");
            }
        }
        else {
            super.onReceive(context,intent);
        }
    }

    static void updateWidgetText(Context context,int appWidgetId,String newText) {
        RemoteViews views = new RemoteViews(context.getPackagename(),R.layout.@R_618_9214@widget);
        views.setTextViewText(R.id.appwidget_text,newText);
        AppWidgetManager.geTinstance(context).updateAppWidget(appWidgetId,views);
    }

    static void updateAppWidget(Context context,final int appWidgetId) {
        RemoteViews views = new RemoteViews(context.getPackagename(),R.layout.@R_618_9214@widget);

        Intent intent = new Intent(context,TestWidget.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,appWidgetId);
        }
    }
}

大佬总结

以上是大佬教程为你收集整理的android – Widget onUpdate在重启后没有在按钮点击时设置pendingIntent全部内容,希望文章能够帮你解决android – Widget onUpdate在重启后没有在按钮点击时设置pendingIntent所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。