android – Widget onUpdate在重启后没有在按钮点击时设置pendingIntent

android – Widget onUpdate在重启后没有在按钮点击时设置pendingIntent,第1张

概述我正在创建一个测试小部件,通过单击其按钮显示随机数.一切都在我的提供者的onUpdate内独立,包括pendingIntent.它工作正常,但重新启动手机后view.setOnClickPendingIntent不工作虽然RemoteViews重新创建没有问题但按钮变得无响应. public class TestWidget extends AppWidgetProvider { stat 我正在创建一个测试小部件,通过单击其按钮显示随机数.一切都在我的提供者的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.test_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://schemas.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/test_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中有多个按钮,并且需要区分其点击广播.

@OverrIDepublic 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类仍然非常简短.

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.test_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.test_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所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1126172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存