2012-02-13 1 views
0

Я столкнулся с довольно интересной проблемой - у меня есть виджет, который при нажатии вызывает запуск OnClickPendingIntent для вызова службы, которая будет воспроизводить звук. Но время от времени, примерно один час, он срабатывал сам по себе.Android OnClickPendingIntent (widget -> service) стрельба сама по себе

виджет:

public class WidgetActivity extends AppWidgetProvider { 
    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
     Intent intent = new Intent(context.getApplicationContext(), SilentService.class); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 

     PendingIntent pendingIntent = PendingIntent.getService(
       context.getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setOnClickPendingIntent(R.id.layout, pendingIntent); 

     appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 

     context.startService(intent); 
    } 


} 

обслуживание:

public class SilentService extends Service { 
    @Override 
    public void onStart(Intent intent, int startId) { 

     Log.e("UpdateWidgetService", "Called"); 

     final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext()); 

     int[] appWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); 

     if (appWidgetIds.length > 0) { 
      for (final int widgetId : appWidgetIds) { 

       final RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.widget_layout); 

       remoteViews.setImageViewResource(R.id.ivc, R.drawable.pic1); 
       appWidgetManager.updateAppWidget(widgetId, remoteViews); 

       MediaPlayer mpl = MediaPlayer.create(this, R.raw.music1); 

       int intRand = random.nextInt(5)+1; 

       Log.e("r",String.valueOf(intRand)); 

       mpl.start(); 

       mpl.setOnCompletionListener(new OnCompletionListener() { 

        public void onCompletion(MediaPlayer mp) { 
         remoteViews.setImageViewResource(R.id.ivc, R.drawable.pic2); 
         appWidgetManager.updateAppWidget(widgetId, remoteViews); 
        } 
        }); 


      } 
      stopSelf(); 
     } 
     super.onStart(intent, startId); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 

Спасибо!

ответ

1

У меня такое чувство, что Android убивает вашу службу, а затем ваш код пытается запустить ее снова. Я видел подобные проблемы. Дайте этому читать: http://developer.android.com/guide/topics/fundamentals.html#proclife

Когда ваша служба перезагрузится после того, как Android попытается вернуть память, она пытается запустить службу, которая создает новый медиаплеер, и запускает его обратно. Это мое предположение, не зная точно, как настроен код, но на основании того, что я вижу, это, скорее всего, проблема.

Смежные вопросы