【问题标题】:how to maintain the app 1*1 widget after reboot without shared preference重启后如何在没有共享偏好的情况下维护应用程序 1*1 小部件
【发布时间】:2016-09-02 13:22:24
【问题描述】:

我创建了 1*1 的小部件。小部件的布局包含 ImageView ,图像视图的图像是这样设置的

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.layout_appwidget_small);
    Intent defineIntent = new Intent(context, MainActivity.class);
    defineIntent.putExtra("from_widget", true);
    PendingIntent pendingIntent1;   
    views.setImageViewResource(R.id.img_widget,R.drawable.ic_launcher);
    defineIntent.putExtra("type_from_widget", 1);
    pendingIntent1 = PendingIntent.getActivity(context, 0, defineIntent, 0);
    views.setOnClickPendingIntent(R.id.img_widget, pendingIntent1);
    appWidgetManager.updateAppWidget(intExtra, views);

但我通过检查 ConfigurationActivity 中的某些条件为 ImageView 选择图像。 我将小部件的详细信息存储在与 AppWidgetId 的共享首选项中,并在重新启动后对其进行维护,加载需要几秒钟。 清除应用数据后重新启动设备时,小部件变为空白的另一个主要原因

将数据存储在共享首选项中。

SharedPreferences prefs = context.getSharedPreferences("prefs", 0);
SharedPreferences.Editor edit = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(MainActivity.widgetBeanArrayList);
edit.putString("widget_arraylist", json);
edit.commit();

在 AppWidgetProvider 类的 onReceive 方法中检索它并维护我的小部件

    @Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    if(intent.getBooleanExtra("from_config_activity",false)){
        for (int mAppWidgetId : intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS)) {
            update(mAppWidgetId,intent.getIntExtra("image_id",0));
        }
    }
    if(intent.getBooleanExtra("switch_on",false)){

        AppWidgetManager appWidgetManager = AppWidgetManager
                .getInstance(context);
        SharedPreferences settings = context.getSharedPreferences("prefs", 0);
        if(settings != null) {
            Gson gson = new Gson();
            String json = settings.getString("widget_arraylist", null);
            Type type = new TypeToken<ArrayList<WidgetBean>>() {}.getType();
            MainActivity.widgetBeanArrayList = gson.fromJson(json, type);

            if(MainActivity.widgetBeanArrayList!=null) {
                if (MainActivity.widgetBeanArrayList.size() > 0){
                    for(int i = 0;i < MainActivity.widgetBeanArrayList.size();i++){
                        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.layout_appwidget_small);
                        if(MainActivity.widgetBeanArrayList.get(i).icon == 1) {
                            views.setImageViewResource(R.id.img_widget, R.drawable.feed_detail_share);
                        }else if(MainActivity.widgetBeanArrayList.get(i).icon == 2){
                            views.setImageViewResource(R.id.img_widget, R.drawable.feed_detail_edit);
                        }else if(MainActivity.widgetBeanArrayList.get(i).icon == 3){
                            views.setImageViewResource(R.id.img_widget, R.drawable.feed_list_audio);
                        }
                        Intent defineIntent = new Intent(context, MainActivity.class);
                        defineIntent.putExtra("from_widget", true);
                        PendingIntent pendingIntent1 = PendingIntent.getActivity(context, 0, defineIntent, 0);
                        views.setOnClickPendingIntent(R.id.img_widget, pendingIntent1);
                        appWidgetManager.updateAppWidget(MainActivity.widgetBeanArrayList.get(i).id, views);
                    }

                }
            }

        }else{
            Log.d("tag", "=============settingd=====null===");
        }
    }

我必须维护小部件图像而不将详细信息存储在共享首选项中。 有什么建议吗?

提前致谢。

【问题讨论】:

    标签: android android-widget android-appwidget


    【解决方案1】:

    最好在 onEnabled() 中重新启动设备后进行逻辑。

       @Override
          public void onEnabled(Context context) {
            // Enter relevant functionality for when the first widget is created(this callback gonna be first after rebooting device)
            final AppWidgetManager appWidgetManager = 
           AppWidgetManager.getInstance(context);
            int widgets_IDs[] = appWidgetManager.getAppWidgetIds(new ComponentName(context, AppWidgetProvider.class));
            for (int widget_id : widgets_IDs) {
             //...get data from shared preference and fill ur widgets by ids
            }
        }
    

    删除应用数据后,没有适当的方法可以返回小部件的当前状态。因此,只需将您的用户移动到配置活动上,让他为小部件选择新设置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多