13

Stworzyłem widżet Androida.
W emulatorach Genymotion Nexus 4 z Androidem 4.4.4 wszystko działa dobrze.
Na moim urządzeniu Nexus 4 z Androidem 4.4.4 umieszczam widżet na ekranie głównym i zamienia się on w widget aplikacji Google.
Następnie zmienia się w mój widget, a następnie ponownie w widżet aplikacji Google i tak dalej. Czyni to, dopóki nie usunę widgetu z ekranu głównego.
Również używam parse.com jako pamięci online i na moim telefonie dane nie wydają się być uzyskane. Nie mogę powiedzieć tego na pewno, ponieważ widget zmienia się.
Mój widget zawiera 3 pliki.
Jeden, który rozszerza klasę aplikacji:Widżet Androida działa dobrze w emulatorze, ale na telefonie zmienia się w widżet aplikacji Google

public class MyApp extends Application 
{ 
    private MyModel model; 

    @Override 
    public void onCreate() { 
     Parse.enableLocalDatastore(this); 
     ParseObject.registerSubclass(GdbdData.class); 
     Parse.initialize(this, "-", "-"); 

     if(model == null) { 
      Intent intent = new Intent(this,GdbdWidgetProvider.class); 
      intent.setAction(WidgetUtils.WIDGET_REFRESH_STORAGE); 
      intent.putExtra("userId",123); 
      sendBroadcast(intent); 
     } 

     super.onCreate(); 
    } 

Jeden WidgetProvider:

@Override 
public void onReceive(Context context, Intent intent) { 
    super.onReceive(context, intent); 
    final String action = intent.getAction(); 
    if (action.equals(WidgetUtils.WIDGET_REFRESH_STORAGE)) 
    { 
     MyApp app = ((MyApp)context.getApplicationContext()); 
     int userId = intent.getIntExtra("userId",0); 
     TryGetModelFromRemoteStorage(userId,context); 
    } 

} 


static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) 
{ 
    MyApp app = ((MyApp)context.getApplicationContext()); 
    MyModel model = app.getModel(); 

    // Construct the RemoteViews object 
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.the_widget); 

    PendingIntent clickerPendingIntent = buildButtonPendingIntent(context); 

    // I change some textviews and imageviews inside the widget here 

    appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 
} 

public static PendingIntent buildButtonPendingIntent(Context context) { 

    // initiate widget update request 
    Intent intent = new Intent(); 
    intent.setAction(WidgetUtils.WIDGET_UPDATE_ACTION); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
    return pendingIntent; 
} 

I jeden broadcastreceiver który obsługuje przycisku na widget:

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(WidgetUtils.WIDGET_UPDATE_ACTION)) { 
     updateWidget(context); 
    } 
} 

private void updateWidget(Context context) { 


    MyApp app = ((MyApp)context.getApplicationContext()); 
    MyModel model = app.getModel(); 

    //I update some fields in the model based on some business rules at this point 

    MyWidgetProvider.SendUpdateMessageToWidgets(context); 


} 

Czy ktoś wie, kim jestem robić źle?

Edit 1: Dodawanie pliku manifestu na żądanie

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.my.app.main" > 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    <application 
     android:name="MyApp" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <receiver android:name=".GdbdWidgetProvider" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_ENABLED" /> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 

      </intent-filter> 

      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/the_widget_info" /> 
     </receiver> 
     <receiver 
      android:name=".TapMarkDayIntentReceiver" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="com.my.app.intents.UPDATE_WIDGET" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/the_widget_info" /> 
     </receiver> 
    </application> 

</manifest> 

Edycja 2, dodaje widget plik xml:

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="140dp" android:minHeight="140dp" 
    android:updatePeriodMillis="1000000" 
    android:previewImage="@drawable/example_appwidget_preview" 
    android:initialLayout="@layout/the_widget" android:widgetCategory="home_screen" 
    android:initialKeyguardLayout="@layout/the_widget"></appwidget-provider> 
+0

zamieść swój manifest –

+0

@DavidWasser dodał go teraz – Para

+0

Proszę również opublikować 'the_widget_info.xml'. –

Odpowiedz

0

Przepraszamy za nie odpowiadając na ostatnie komentarze, ale byłem bardzo zajęty.
Dziękuję wszystkim za pomoc.
Co się stało, to że miałem zwrotne instrukcje w moich metodach onUpdate, onEnabled, onDisabled i orReceive w WidgetProvider i widocznie jest to złe. Po ich usunięciu to już nie występowało.