如何从小部件本身内部手动调用onUpdate [英] How to manually call `onUpdate` from within the widget itself

查看:76
本文介绍了如何从小部件本身内部手动调用onUpdate的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

public class VWid extends AppWidgetProvider {

    public static String WIDGET_UPDATE = "WIDGET_UPDATE";

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);

        if (WIDGET_UPDATE.equals(intent.getAction())) {
            Toast.makeText(context, "onReceiver()", Toast.LENGTH_LONG).show();
        }
    }

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this
        // provider
        for (int i = 0; i < N; i++) {
            int appWidgetId = appWidgetIds[i];
            int k, p;
            SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy hh:mm a");

            AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
            int k = audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM);
            Toast.makeText(getActivity(), k+"", Toast.LENGTH_LONG).show();

            Intent imageview2Intent= new Intent(context, VWid.class);
            PendingIntent pendingIntent2= PendingIntent.getBroadcast(context,0, imageview2Intent,0);

            views.setOnClickPendingIntent(R.id.imagebuttonrefresh, pendingIntent2); //

            views.setTextViewText(R.id.textview1, "Last Refresh: " + dateFormat.format(new Date()).toString());

            pushWidgetUpdate(context, views);
        }
    }

    public static void pushWidgetUpdate(Context context, RemoteViews remoteViews) {
        ComponentName myWidget = new ComponentName(context, VWid.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        manager.updateAppWidget(myWidget, remoteViews);
        Log.d("UPDATED", "testing");
    }
}

当我第一次将小部件添加到主屏幕时, textview1 显示:最后刷新:{当前日期和时间} .它还会在Toast中显示系统音量.

When I first add the widget to my homescreen, textview1 displays: Last Refresh: {current date and time}. It also displays the system volume in a Toast.

假设我增加/减少了系统音量,当我点击刷新时, onUpdate()函数应该会触发,显示更新的Toast,还将 textview1 文本更新为新的数据和时间,但是那没有发生.

Let's say I increase/decrease the system volume, when I hit refresh the onUpdate() function should fire showing the updated Toast and also updating the textview1 text to the new data and time but that's not happening.

实际上如何调用 onUpdate()函数,该如何修改代码以实现刷新.

How can I modify the code so I can achieve a refresh, in essence calling the onUpdate() function.

推荐答案

尝试一下:

public class WidgetProvider extends AppWidgetProvider {

 public static final String REFRESH_ACTION = "com.packagename.REFRESH_ACTION";

@Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);

   if (intent.getAction().equals(WidgetProvider.REFRESH_ACTION)) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);

            if (appWidgetIds != null && appWidgetIds.length > 0) {
                Toast.makeText(context, "REFRESH", Toast.LENGTH_SHORT).show();
                this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
            }
        }
    }

}


@Override
public void onUpdate(final Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    final int N = appWidgetIds.length;


    for (int i = 0; i < N; ++i) {

        RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

        Intent intentServiceCall = new Intent(context, WidgetService.class);
        intentServiceCall.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);

     //Refresh
        Intent refreshIntent = new Intent(context, WidgetProvider.class);
        refreshIntent.setAction(WidgetProvider.REFRESH_ACTION);
        refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
        intentServiceCall.setData(Uri.parse(intentServiceCall.toUri(Intent.URI_INTENT_SCHEME)));
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        rv.setOnClickPendingIntent(R.id.ivRefreshWidget, pendingIntent);

  appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
    }
    super.onUpdate(context, appWidgetManager, appWidgetIds);
}

这篇关于如何从小部件本身内部手动调用onUpdate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆