1

我這裏看到類似的問題對SO後沒有更新,但似乎在我的情況下工作...的Android - Appwidget與Remoteviews重啓

我創建了一個appwidget與AdapterViewFlipper(簡單ViewAnimator,將兩者之間的動畫或更多的視圖已添加到它)。 appwidget有一個Next按鈕,使用戶可以導航到小部件上的下一個視圖。

這一切工作正常,當我第一次添加appwidget。但是,如果智能手機重新啓動,小部件的Next按鈕不再適用於我的Samsung 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" /> 

任何幫助,將不勝感激!

回答

0

取決於啓動程序,不能保證您的AppWidget將在設備啓動後立即更新。它可能會被直接刷新,或者等到系統啓動後updatePeriodMillis過去。

要解決您的問題,請定義一個BroadcastReceiver,在重啓後觸發更新AppWidget

AndroidManifest.xml中,定義BootReceiver以獲取boot_complete消息。

<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> 

,並定義BootReceiver.java開始你AppWidgetUpdateService

public class BootReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent){ 
     //start appwidget update service 
    } 
}