当前位置: 首页 > 面试题库 >

如何从小部件本身内部手动调用onUpdate

公良泰宁
2023-03-14
问题内容
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显示:Last Refresh: {current date and time}。它还在Toast中显示系统音量。

假设我增加/减少了系统音量,当我点击“刷新”时,该onUpdate()功能将触发以显示更新的Toast,并将textview1文本更新为新的数据和时间,但这没有发生。

从本质上讲,如何修改代码,以便可以实现刷新onUpdate()


问题答案:

试试这个:

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);
}


 类似资料:
  • 问题内容: 我只需要更新,而不需要更新整个表单。我尝试使用,,,但没有人正在为我想。使用时,它正在检查不需要执行的验证。 我该如何实现? 问题答案: 首先,仅因为它根本不支持该属性,它的确不会与一起使用。也许您真的打算使用? 修复a身份后, 阅读完该答案后,您应该已经发现数据表在该特定的代码段中由标识。因此,应该采取以下所有措施: 请注意,直到PrimeFaces 3.3为止,在某些复杂的UI组合

  • 问题内容: 如何在Java中调用node.js并将console.log值保存在String变量中? 问题答案: Java应用程序可能与正在运行的Node.JS应用程序进行通信。例如,您可以在可用端口上运行Node.JS应用,而Java应用可以通过tcp套接字与之通信。 http://nodejs.org/api/net.html 或者,您可以创建一个http服务器并公开Java应用程序可以使用的

  • 问题内容: 在下面显示的代码片段中,内部类本身继承了外部类。 方法中的唯一语句(最后一个片段)将值分配给类的私有字段,然后调用该方法。 该方法会导致另一个字符串- 要设置的私人领域中的类调用之前的方法延长。 因此,方法中的以下两个语句: 应该显示 另一个价值 另一个价值 但是他们显示 初始值 初始值 为什么会这样? 问题答案: 方法和领域都是。因此,其他子类(包括子类)均无法访问它们。它们不是继承

  • 问题内容: 我可以更新点子管理的软件包,但是如何更新点子本身?据介绍,我目前在virtualenv中安装了pip 1.1,我想更新到最新版本。 这是什么命令?我是否需要使用distribute,或者是否有本机pip或virtualenv命令?我已经尝试过,并没有成功。 问题答案: 仅仅是一个的PyPI包像任何其他; 您可以像升级任何软件包一样使用它来升级自身: 在Windows上,推荐的命令是:

  • 问题内容: 我想从函数本身内部打印python函数的文档字符串。例如 目前,在定义之后,我将直接执行此操作。 但宁愿让函数自己执行此操作。 我已经尝试在my_function内调用它 ,但这没有用。 问题答案: 只要您不更改绑定到名称的对象,此方法就可以工作。 您会执行此操作的情况很少见,但确实会发生。 但是,如果您编写这样的装饰器: 现在您可以执行以下操作: 这将确保您的函数获得对自身的引用(类