5

Ho un AppWidget con 2 intent in sospeso. Funzionano la maggior parte del tempo, ma dopo un po 'smettono di rispondere. L'unica cosa che sono stato in grado di individuare è che sono danneggiati dopo il riavvio di Launcher, ad esempio utilizzo Launcher Pro e, a volte, interferisco con le impostazioni e devo riavviarlo. Dopo questo non funzionano affatto.AppWidget PendingIntent non funziona dopo il riavvio di Launcher

Qui sono i miei onRecieve() e onUpdate() metodi:

public void onReceive(Context context, Intent intent) 
{ 
    super.onReceive(context, intent); 
    String action = intent.getAction(); 
    if(action.equals("android.tristan.widget.digiclock.CLICK")) 
    { 
     PackageManager packageManager = context.getPackageManager(); 
     Intent alarmClockIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER); 

     String clockImpls[][] = { 
       {"HTC Alarm Clock", "com.htc.android.worldclock", "com.htc.android.worldclock.AlarmClock" }, 
       {"Standar Alarm Clock", "com.android.deskclock", "com.android.deskclock.AlarmClock"}, 
       {"Froyo Nexus Alarm Clock", "com.google.android.deskclock", "com.android.deskclock.DeskClock"}, 
       {"Moto Blur Alarm Clock", "com.motorola.blur.alarmclock", "com.motorola.blur.alarmclock.AlarmClock"} 
     }; 

     boolean foundClockImpl = false; 

     for(int i=0; i<clockImpls.length; i++) { 
      String vendor = clockImpls[i][0]; 
      String packageName = clockImpls[i][1]; 
      String className = clockImpls[i][2]; 
      try { 
       ComponentName cn = new ComponentName(packageName, className); 
       ActivityInfo aInfo = packageManager.getActivityInfo(cn, PackageManager.GET_META_DATA); 
       alarmClockIntent.setComponent(cn); 
       foundClockImpl = true; 
      } catch (NameNotFoundException e) { 
       Log.d(LOGTAG, "Error," + vendor + " does not exist"); 
      } 
     } 

     if (foundClockImpl) { 
     Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); 
     vibrator.vibrate(50); 
     final RemoteViews views = new RemoteViews(context.getPackageName(), layoutID); 
     views.setOnClickPendingIntent(R.id.TopRow, PendingIntent.getActivity(context, 0, new Intent(context, DigiClock.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_UPDATE_CURRENT)); 
     AppWidgetManager.getInstance(context).updateAppWidget(intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS), views); 
     alarmClockIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(alarmClockIntent);  
    } 
    } 
} 

     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
super.onUpdate(context, appWidgetManager, appWidgetIds); 
    context.startService(new Intent(UpdateService.ACTION_UPDATE)); 
    context.startService(new Intent(context, ScreenUpdateService.class)); 
    final int Top = appWidgetIds.length; 
    final int Bottom = appWidgetIds.length; 
    for (int i=0; i<Top; i++) 
    { 
    int[] appWidgetId = appWidgetIds; 
    final RemoteViews top=new RemoteViews(context.getPackageName(), layoutID); 
    Intent clickintent=new Intent("android.tristan.widget.digiclock.CLICK"); 
    PendingIntent pendingIntentClick=PendingIntent.getBroadcast(context, 0, clickintent, 0); 
    top.setOnClickPendingIntent(R.id.TopRow, pendingIntentClick); 
    appWidgetManager.updateAppWidget(appWidgetId, top); 
} 
for (int i=0; i<Bottom; i++) 
{ 
    int[] appWidgetId = appWidgetIds; 
    RemoteViews bottom=new RemoteViews(context.getPackageName(), layoutID); 
    Intent clickintent=new Intent("android.tristan.widget.digiclock.CLICK_2"); 
    PendingIntent pendingIntentClick=PendingIntent.getBroadcast(context, 0, clickintent, 0); 
    bottom.setOnClickPendingIntent(R.id.BottomRow, pendingIntentClick); 
    appWidgetManager.updateAppWidget(appWidgetId, bottom); 
} 
} 

Ho letto di mettere gli intenti in un servizio, ma hanno provato e fallito. Qualsiasi aiuto è apprezzato.

+0

che cosa è con la chiamata a 'super.onUpdate();'? Non fa nulla secondo la fonte http://androidxref.com/4.4.4_r1/xref/frameworks/base/core/java/android/appwidget/AppWidgetProvider.java#113. – faizal

+0

'appWidgetManager.updateAppWidget()' non ha bisogno di essere chiamato in un ciclo per ogni widget. Accetta un array intero. Quindi potresti semplicemente chiamare 'appWidgetManager.updateAppWidget (appWidgetIds, top)' una volta invece di 'appWidgetManager.updateAppWidget (appWidgetId, in alto)' più volte. – faizal

risposta

4

Come ho scritto here si dovrebbe produrre solo una singola istanza di RemoteView.

+0

In realtà, la creazione di una singola istanza causerà il collasso del widget alla fine; poiché la memoria aumenterà con ogni istruzione inviata alla vista remota – htafoya

Problemi correlati