Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 应用程序小部件获取数据的典型来源是什么?_Android - Fatal编程技术网

Android 应用程序小部件获取数据的典型来源是什么?

Android 应用程序小部件获取数据的典型来源是什么?,android,Android,目前我正在尝试消化Android应用程序小部件。我知道应用程序小部件是驻留在主屏幕上的小型应用程序,可以在支持的视图中显示一些数据。我试图理解的是构建应用程序小部件中的典型设计模式 应用程序小部件获取数据的典型来源是什么?以下是我迄今为止的理解和问题: 数据库:MainActivity从网络获取数据,存储在本地数据库中,然后将广播意图发送给小部件,以便小部件通过从数据库获取数据来更新自身 网络:widget可以直接使用改型进行网络呼叫吗 共享首选项:小部件从共享首选项中获取一小段信息(比如字符

目前我正在尝试消化Android应用程序小部件。我知道应用程序小部件是驻留在主屏幕上的小型应用程序,可以在支持的视图中显示一些数据。我试图理解的是构建应用程序小部件中的典型设计模式

应用程序小部件获取数据的典型来源是什么?以下是我迄今为止的理解和问题:

  • 数据库:MainActivity从网络获取数据,存储在本地数据库中,然后将广播意图发送给小部件,以便小部件通过从数据库获取数据来更新自身

  • 网络:widget可以直接使用改型进行网络呼叫吗

  • 共享首选项:小部件从共享首选项中获取一小段信息(比如字符串数组)是个好主意吗

  • MainActivity:MainActivity(或任何其他活动类)能否直接在小部件的Listview适配器中设置数据

  • 意图:我可以在广播意图中使用putExtra来设置字符串数组吗


在我的用例中,我在mainActivity中获得了我想要推送到小部件的新数据。最好的方法是什么?

我必须从数据库中获取数据,该数据库正在从
MainActivty
更新。所以,为了获取widget类中的数据,我只调用了查询来从数据库中获取数据。我也使用共享偏好来获取一些数据。这不是问题。您可以使用共享首选项来获取数据

public class BottleWidget extends AppWidgetProvider {

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                            int appWidgetId) {
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.bottle_widget);

    // isUnitAdded getting value from shared pref
    boolean isUnitAdded= TinyDB.getInstance(context).getBoolean("units_added");
    if (isUnitAdded){
        Intent intent2 = new Intent(context, MainActivity.class);
        PendingIntent pendingIntent2 = PendingIntent.getActivity(context, 0, intent2, 0);
        views.setOnClickPendingIntent(R.id.widget_root_layout_bottle, pendingIntent2);
    }
    else {
        Intent intent2 = new Intent(context, UnitsActivity.class);
        PendingIntent pendingIntent2 = PendingIntent.getActivity(context, 0, intent2, 0);
        views.setOnClickPendingIntent(R.id.widget_root_layout_bottle, pendingIntent2);
    }




    Constants constants = new Constants(context);

      //getting value from shared pref
    Double mTargetQuantity = Double.parseDouble(constants.getPref(Constants.DRINK_VALUE_SHARED_PREF, context));
    if (mTargetQuantity ==0)
        mTargetQuantity= Double.valueOf(100);
    // initializing database
    MyDataBase myDataBase = MyDataBase.getInstance(context);
    Calendar calendarToday = Calendar.getInstance();
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
    long millis = calendarToday.getTimeInMillis();
    String date = dateFormat.format(millis);

     // calling query to get data from database
    int mProgress = myDataBase.dailyConsumptionDao().getQuantity(date);

      // getting data from sharedpref
    String drinkUnit=constants.getPref(Constants.DRINK_UNIT_SHARED_PREF,context);
    int target= (int)Math.round(mTargetQuantity);
    int percentage= (mProgress*100)/target;
    int Icon= TinyDB.getInstance(context).getInt("icon");

    views.setImageViewResource(R.id.widget_iv_add,R.drawable.ic_add);
    views.setTextViewText(R.id.tv_total_percentage,String.valueOf(percentage)+ " %");
    views.setTextColor(R.id.tv_total_percentage, Color.WHITE);

    appWidgetManager.updateAppWidget(appWidgetId, views);
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    // There may be multiple widgets active, so update all of them
    for (int appWidgetId : appWidgetIds) {
        updateAppWidget(context, appWidgetManager, appWidgetId);
    }
}

@Override
public void onEnabled(Context context) {
    // Enter relevant functionality for when the first widget is created
}

@Override
public void onDisabled(Context context) {
    // Enter relevant functionality for when the last widget is disabled
}

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext());
    ComponentName thisWidget = new ComponentName(context.getApplicationContext(), BottleWidget.class);
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
    if (appWidgetIds != null && appWidgetIds.length > 0) {
        onUpdate(context, appWidgetManager, appWidgetIds);
    }
}

您想在widget类内使用Intent.putExtras还是在mainActivity内使用Intent.putExtras向widget发送数据?在mainActivity内使用Intent.putExtras向widget发送数据。数据是字符串数组。您不需要使用意图将数据发送到小部件。您可以将其保存在mainActivity内的共享首选项中,或者如果列表已存储在数据库中,则只需调用查询即可获取数据并在小部件类中使用它。我在widget class.awesome中添加我的代码,从preference和db中获取数据。谢谢你,伙计。还有一个问题:在从mainActivity更新SharedReference之后,我想触发小部件的更新。我正在使用此代码,但它没有更新小部件。AppWidgetManager AppWidgetManager=AppWidgetManager.getInstance(getApplicationContext());int-appWidgetIds[]=appWidgetManager.getAppWidgetIds(新组件名(getApplicationContext(),WidgetDataProvider.class));appWidgetManager.notifyAppWidgetViewDataChanged(AppWidgetId,R.id.widget_列表);我希望答案中的代码能解决您的问题。