为啥 setOnClickPendingIntent 不起作用?

Posted

技术标签:

【中文标题】为啥 setOnClickPendingIntent 不起作用?【英文标题】:Why is setOnClickPendingIntent not working?为什么 setOnClickPendingIntent 不起作用? 【发布时间】:2019-08-06 03:12:26 【问题描述】:

我通过 .setOnClickPendingIntent 将挂起的意图附加到小部件按钮,并且在单击按钮时没有得到任何响应。奇怪的是,当我在我的下载服务中实现相同的代码时,它想要工作(但不会因为服务在循环中运行多个周期,所以活动只是弹出并在单击按钮时再次消失。)

我需要它才能在我的主线程上运行,但如果我弄清楚为什么它没有按预期调用,我就无法终生。

监听器在下面的方法中附加到 RemoteViews 按钮上:

public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int widgetId) 
    mContext = context;

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

    // Create a PendingIntent to open the config activity
    Intent configIntent = new Intent(context, ConfigActivity.class);
    configIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
    configIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);

    // Keep in mind PendingIntent uniqueness rules. Use the widget ID as a request code
    PendingIntent configPendingIntent = PendingIntent.getActivity(context, widgetId, configIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    // Attach the PendingIntent to our config button
    widgetViews.setOnClickPendingIntent(R.id.configButton, configPendingIntent);

    appWidgetManager.updateAppWidget(widgetId, widgetViews);

    if(loadChached() != null) 
        Weather weather = loadChached();

        widgetViews.setTextViewText(R.id.conditionsDisplay, weather.getConditions());
        widgetViews.setTextViewText(R.id.tempDisplay, String.valueOf(weather.getDisplayTemp()));
        widgetViews.setTextViewText(R.id.timestampDisplay, weather.getTimeStamp());

        if(loadPreferences(context).equals("Dark")) 
            Log.i(TAG, "updateWidget: Activating Dark Theme");
            widgetViews.setTextColor(R.id.conditionsDisplay, context.getResources().getColor(android.R.color.background_dark));
            widgetViews.setTextColor(R.id.tempDisplay, context.getResources().getColor(android.R.color.background_dark));
            widgetViews.setTextColor(R.id.timestampDisplay, context.getResources().getColor(android.R.color.background_dark));
        

        else if(loadPreferences(context).equals("Light")) 
            Log.i(TAG, "updateWidget: Activating Light Theme");
            widgetViews.setTextColor(R.id.conditionsDisplay, context.getResources().getColor(android.R.color.white));
            widgetViews.setTextColor(R.id.tempDisplay, context.getResources().getColor(android.R.color.white));
            widgetViews.setTextColor(R.id.timestampDisplay, context.getResources().getColor(android.R.color.white));
        

        appWidgetManager.updateAppWidget(widgetId, widgetViews);
    

    Intent updateIntent = new Intent(context, DownloadIntentService.class);
    updateIntent.setAction(WeatherWidgetProvider.ACTION_UPDATE_WEATHER);

    Log.i(TAG, "onUpdate: Starting Service");

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
        try 
            context.startForegroundService(updateIntent);
        

        catch (Exception e) 
            e.printStackTrace();
        
    

    else 
        try 
            context.startService(updateIntent);
        

        catch (Exception e) 
            e.printStackTrace();
        
    

我希望启动的活动已在清单中注册,并带有一个意图过滤器:

<activity android:name=".ConfigActivity">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
        </intent-filter>
    </activity>

非常感谢任何帮助。

【问题讨论】:

当您单击按钮时,您在 logcat 中看到任何内容吗?不要过滤 logcat,因为你可能会错过一些重要的东西! 它没有被调用。问题是我也在从服务中调用 .updateWidget ,覆盖在提供程序中添加到它的任何内容。一旦我将所有更新移回主线程,问题就解决了。 【参考方案1】:

问题是我也在从服务调用 .updateWidget ,覆盖了提供程序中添加到它的任何内容。一旦我将所有更新移回主线程,问题就解决了。

【讨论】:

您可以通过单击答案旁边的绿色复选标记来接受此答案。这会将问题从未回答的问题列表中删除。

以上是关于为啥 setOnClickPendingIntent 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?