Android-Appwidget,远程视图在重新启动后不更新
我在这里看到了类似的问题,但在我的情况下似乎没有任何效果 我用一个Android-Appwidget,远程视图在重新启动后不更新,android,android-appwidget,remoteview,appwidgetprovider,samsung-touchwiz,Android,Android Appwidget,Remoteview,Appwidgetprovider,Samsung Touchwiz,我在这里看到了类似的问题,但在我的情况下似乎没有任何效果 我用一个AdapterViewWFLipper创建了一个appwidget(简单的ViewAnimator,它将在添加到它的两个或多个视图之间设置动画)。appwidget有一个“下一步”按钮,允许用户导航到小部件上的下一个视图 当我第一次添加appwidget时,一切都很好。但是,如果智能手机重新启动,小部件的“下一步”按钮在我的三星S4上就不再起作用了(调用了方法onReceive,但什么也没有发生,它不会导航到下一个视图,而是卡在第
AdapterViewWFLipper
创建了一个appwidget(简单的ViewAnimator,它将在添加到它的两个或多个视图之间设置动画)。appwidget有一个“下一步”按钮,允许用户导航到小部件上的下一个视图
当我第一次添加appwidget时,一切都很好。但是,如果智能手机重新启动,小部件的“下一步”按钮在我的三星S4上就不再起作用了(调用了方法onReceive
,但什么也没有发生,它不会导航到下一个视图,而是卡在第一个视图中)。我必须删除小部件,并再次添加它,以使其工作
我怀疑这是Touchwiz的问题,因为我在另一部手机(Moto G)上测试了它,它工作正常
以下是我的代码的一些部分:
AppWidgetProvider
public class AppWidgetProvider extends AppWidgetProvider {
public static final String NEXT_ACTION = VersionUtil.getPackageName() + ".action.NEXT";
private static final String TAG = DailyAppWidget.class.getSimpleName();
@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 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, colorValue);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId, int primaryColor) {
Intent intent = new Intent(context, ViewFlipperWidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
// When intents are compared, the extras are ignored, so we need to embed the extras
// into the data so that the extras will not be ignored.
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
// Instantiate the RemoteViews object for the app widget layout.
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.app_widget);
// open the activity from the widget
Intent intentApp = new Intent(context, MainActivity.class);
intentApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intentApp, 0);
rv.setOnClickPendingIntent(R.id.widget_title, pendingIntent);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
rv.setRemoteAdapter(R.id.adapter_flipper, intent);
} else {
rv.setRemoteAdapter(appWidgetId, R.id.adapter_flipper, intent);
}
// Bind the click intent for the next button on the widget
final Intent nextIntent = new Intent(context,
AppWidgetProvider.class);
nextIntent.setAction(AppWidgetProvider.NEXT_ACTION);
nextIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
final PendingIntent nextPendingIntent = PendingIntent
.getBroadcast(context, 0, nextIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
rv.setOnClickPendingIntent(R.id.widget_btn_next, nextPendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, mRemoteViews);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(NEXT_ACTION)) {
RemoteViews rv = new RemoteViews(context.getPackageName(),
R.layout.daily_app_widget);
rv.showNext(R.id.adapter_flipper);
int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
Log.e(TAG, "onReceive APPWIDGET ID " + appWidgetId);
AppWidgetManager.getInstance(context).partiallyUpdateAppWidget(
appWidgetId, rv);
}
super.onReceive(context, intent);
}
服务
public class FlipperRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private Context mContext;
private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
private static final String TAG = "FILPPERWIDGET";
public FlipperRemoteViewsFactory(Context context, Intent intent) {
mContext = context;
mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
//... get the data
}
@Override
public void onCreate() {
Log.e(TAG, "onCreate()");
}
@Override
public void onDataSetChanged() {
Log.i(TAG, "onDataSetChanged()");
}
@Override
public void onDestroy() {
}
@Override
public int getCount() {
//... return size of dataset
}
@Override
public RemoteViews getViewAt(int position) {
Log.i(TAG, "getViewAt()" + position);
RemoteViews page = new RemoteViews(mContext.getPackageName(), R.layout.app_widget_item);
//... set the data on the layout
return page;
}
@Override
public RemoteViews getLoadingView() {
Log.i(TAG, "getLoadingView()");
return new RemoteViews(mContext.getPackageName(), R.layout.appwidget_loading);
}
@Override
public int getViewTypeCount() {
Log.i(TAG, "getViewTypeCount()");
return 1;
}
@Override
public long getItemId(int position) {
Log.i(TAG, "getItemId()");
return position;
}
@Override
public boolean hasStableIds() {
Log.i(TAG, "hasStableIds()");
return true;
}
}
清单
<receiver android:name=".AppWidgetProvider"
android:label="@string/app_name"
android:enabled="@bool/is_at_least_12_api">
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/app_widget_info" />
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
</receiver>
<!-- Service serving the RemoteViews to the collection widget -->
<service android:name=".ViewFlipperWidgetService"
android:permission="android.permission.BIND_REMOTEVIEWS"
android:exported="false" />
应用程序wigdet信息
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialKeyguardLayout="@layout/app_widget"
android:initialLayout="@layout/app_widget"
android:minHeight="110dp"
android:minWidth="250dp"
android:previewImage="@drawable/widget_preview"
android:resizeMode="horizontal|vertical"
android:updatePeriodMillis="14400000"
android:widgetCategory="home_screen" />
任何帮助都将不胜感激 取决于启动器,不能保证您的
AppWidget
会在设备启动后立即更新。它可以立即刷新,或者等待系统启动后通过updatePeriodMillis
要解决您的问题,请定义一个BroadcastReceiver
,它将在重新启动后触发AppWidget
的更新
在AndroidManifest.xml
中,定义bootceiver
以获取启动完成消息
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".BootReceiver" android:enabled="true" android:exported="false" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
public class BootReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
//start appwidget update service
}
}