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