android - 删除并重新添加后小部件点击不起作用

标签 android widget

我开发了一个 Android 小部件,允许用户:

  • 点击刷新按钮刷新小部件内容
  • 点击 ListView 项打开 Activity 。

我的问题是:

  • 我的小部件在第一次添加到主屏幕时工作(按钮可以点击, ListView 项目可以点击)
  • 从主屏幕中删除小部件并再次添加,现在按钮不再起作用( ListView 仍然起作用)。我已删除应用程序并重新安装,但仍然无法正常工作。
  • 重启我的手机 => 我的小部件再次工作(按钮可以点击, ListView 项目可以点击)
  • 删除小部件并重新添加 => 不再工作。

这是我的代码:

LatestScuttleWidgetProvider 扩展 AppWidgetProvider

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
    // TODO Auto-generated method stub
    ComponentName latestWidget = new ComponentName(context,
            LatestScuttleWidgetProvider.class);
    int[] allWidgets = appWidgetManager.getAppWidgetIds(latestWidget);
    for (int widgetId : allWidgets) {

        Intent serviceIntent = new Intent(context,
                DownloadLatestScuttleService.class);
        serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                widgetId);
        context.startService(serviceIntent);
        LogUtil.e("Latest scutify widget update", "update remote view");
    }

    super.onUpdate(context, appWidgetManager, appWidgetIds);
}

/*
 * (non-Javadoc)
 *
 * @see
 * android.appwidget.AppWidgetProvider#onEnabled(android.content.Context)
 */
@Override
public void onEnabled(Context context) {
    // TODO Auto-generated method stub
    super.onEnabled(context);
}

/*
 * (non-Javadoc)
 *
 * @see
 * android.appwidget.AppWidgetProvider#onReceive(android.content.Context,
 * android.content.Intent)
 */
@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    super.onReceive(context, intent);

    if (intent.getAction().equals(
            CommonConstant.DOWNLOAD_LATEST_SCUTTLE_WIDGET_ACTION)) {

        LogUtil.e("Onreceive broadcast", intent.getAction());
        int appWidgetId = intent.getIntExtra(
                AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);
        LogUtil.e("updateWidgetListview", appWidgetId
                + "---------------------------");

        AppWidgetManager appWidgetManager = AppWidgetManager
                .getInstance(context);
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.layout_widget_latest_scuttles);

        boolean isDownloading = intent.getBooleanExtra(
                CommonConstant.DOWNLOAD_LATEST_SCUTTLE_WIDGET_DOWNLOADING,
                false);
        if (isDownloading) {

            remoteViews.setViewVisibility(R.id.latest_widget_loading,
                    View.VISIBLE);
        } else {

            remoteViews.setViewVisibility(R.id.latest_widget_loading,
                    View.GONE);

            // Set adapter for list view
            Intent svcIntent = new Intent(context,
                    LatestScuttlesWidgetService.class);
            svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                    appWidgetId);
            svcIntent.setData(Uri.parse(svcIntent
                    .toUri(Intent.URI_INTENT_SCHEME)));
            remoteViews.setRemoteAdapter(R.id.latest_widget_listview,
                    svcIntent);

            // Set item click event
            Intent startActivityIntent = new Intent(context,
                    LatestScuttlesActivity.class);
            PendingIntent startActivityPendingIntent = PendingIntent
                    .getActivity(context, 0, startActivityIntent,
                            PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews
                    .setPendingIntentTemplate(R.id.latest_widget_listview,
                            startActivityPendingIntent);

            // Update button click
            Intent updateIntent = new Intent(context,
                    DownloadLatestScuttleService.class);
            updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                    appWidgetId);
            PendingIntent updatePendingIntent = PendingIntent.getService(
                    context, 0, updateIntent, 0);
            remoteViews.setOnClickPendingIntent(R.id.latest_widget_update,
                    updatePendingIntent);

            // Notice data changes and update widget views
            appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId,
                    R.id.latest_widget_listview);
        }

        appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
    }
}

LatestScuttlesWidgetService 扩展 RemoteViewsService

@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
    // TODO Auto-generated method stub

    LogUtil.e("RemoteViewsFactory",
            "--------------------RemoteViewsFactory------------------");
    return (new LatestWidgetAdapter(getApplicationContext(), intent));
}

LatestWidgetAdapter 实现 RemoteViewsFactory

public RemoteViews getViewAt(int position) {
    // TODO Auto-generated method stub
    final RemoteViews remoteView = new RemoteViews(
            mContext.getPackageName(),
            R.layout.layout_widget_latest_scuttles_list_item);
    /*
     * Date date = new Date(System.currentTimeMillis()); String updateTime =
     * DateFormat.format("yyyy/MM/dd HH:mm:ss", date) .toString();
     */
    ScuttleModel scuttle = (ScuttleModel) mScuttles.get(position);
    String timeAgo = Utilities.getTimeAgo(scuttle.getSubmitted());
    remoteView.setTextViewText(R.id.latest_widget_list_text,
            scuttle.getUsername());
    remoteView.setTextViewText(R.id.latest_widget_list_text2,
            scuttle.getScuttle());
    remoteView.setTextViewText(R.id.latest_widget_posted_time, timeAgo);

    // Start activity when click reply button
    Intent intent = new Intent();
    // intent.setClass(mContext, LatestScuttlesActivity.class);
    remoteView.setOnClickFillInIntent(R.id.latest_widget_reply, intent);
    return remoteView;
}

/*
 * (non-Javadoc)
 *
 * @see
 * android.widget.RemoteViewsService.RemoteViewsFactory#getViewTypeCount()
 */
@Override
public int getViewTypeCount() {
    // TODO Auto-generated method stub
    return 1;
}

/*
 * (non-Javadoc)
 *
 * @see android.widget.RemoteViewsService.RemoteViewsFactory#hasStableIds()
 */
@Override
public boolean hasStableIds() {
    // TODO Auto-generated method stub
    return false;
}

/*
 * (non-Javadoc)
 *
 * @see android.widget.RemoteViewsService.RemoteViewsFactory#onCreate()
 */
@Override
public void onCreate() {
    // TODO Auto-generated method stub

    mDatabase = new MySqliteDAO(mContext);
    mDatabase.open();
    mScuttles = mDatabase.getScuttles();
    LogUtil.e("RemoteViewsService.RemoteViewsFactory#onCreate()", ""
            + mScuttles.size());
    mDatabase.close();
}

/*
 * (non-Javadoc)
 *
 * @see
 * android.widget.RemoteViewsService.RemoteViewsFactory#onDataSetChanged()
 */
@Override
public void onDataSetChanged() {
    // TODO Auto-generated method stub
    mDatabase.open();
    mScuttles = mDatabase.getScuttles();
    LogUtil.e("RemoteViewsService.RemoteViewsFactory#onDataSetChanged()",
            "" + mScuttles.size());
    mDatabase.close();
}

DownloadLatestScuttleService 扩展 IntentService

int appWidgetId = 0;
    if (intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID))
        appWidgetId = intent.getIntExtra(
                AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);

    // Send broadcast to display loading view
    Intent widgetUpdateIntent = new Intent();
    widgetUpdateIntent
            .setAction(CommonConstant.DOWNLOAD_LATEST_SCUTTLE_WIDGET_ACTION);
    widgetUpdateIntent
            .putExtra(
                    CommonConstant.DOWNLOAD_LATEST_SCUTTLE_WIDGET_DOWNLOADING,
                    true);
    widgetUpdateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
            appWidgetId);
    sendBroadcast(widgetUpdateIntent);

    // Get data from api
    HomeApi homeApi = new HomeApi();
    List<BaseModel> scuttles = homeApi.getScuttles(30).getModels();

    // Insert data to database
    MySqliteDAO database = new MySqliteDAO(getApplicationContext());
    database.open();
    database.insertLatestScuttles(scuttles);
    database.close();

    // Callback
    widgetUpdateIntent = new Intent();
    widgetUpdateIntent
            .setAction(CommonConstant.DOWNLOAD_LATEST_SCUTTLE_WIDGET_ACTION);
    widgetUpdateIntent.putExtra(
            CommonConstant.DOWNLOAD_LATEST_SCUTTLE_WIDGET_DOWNLOADING,
            false);
    widgetUpdateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
            appWidgetId);
    sendBroadcast(widgetUpdateIntent);
    LogUtil.e("onHandleIntent",
            "------- sendBroadcast(widgetUpdateIntent) ----------");

并体现

<!-- Widget -->
    <receiver android:name="com.scutify.widgets.LatestScuttleWidgetProvider" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="com.scutify.widgets.LatestScuttleCallBack" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/latest_scutlles_widget_provider" />
    </receiver>

    <service
        android:name="com.scutify.widgets.services.DownloadLatestScuttleService"
        android:permission="android.permission.BIND_REMOTEVIEWS" >
    </service>
    <service
        android:name="com.scutify.widgets.services.LatestScuttlesWidgetService"
        android:permission="android.permission.BIND_REMOTEVIEWS" />

最佳答案

关于LatestScuttleWidgetProvider extends AppWidgetProvider

变化自:

PendingIntent updatePendingIntent = PendingIntent.getService(
                context, 0, updateIntent, 0);

到:

PendingIntent updatePendingIntent = PendingIntent.getService(
                    context, 0, updateIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT);

关于android - 删除并重新添加后小部件点击不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23332193/

相关文章:

android - 如何从 xml 动态地将数据添加到微调器中

Android - 视频重新启动或恢复

java - 发出结构化 JSON 请求

angularjs - 如何使用包裹在 CKEditor 小部件中的 Angular 指令

html - 表示 UI 小部件的语义 HTML 元素

python - 将 MySQL 数据库中的信息打包到 tkinter box 的最佳方法

java - Android onTouchEvent坐标跳转

android - 使用红外线检测 ios 或 android 设备中的对象

Django:将 Javascript 添加到自定义小部件的最佳方式

python - 配置独立的小部件(Tkinter ttk、Python)