2013-07-07 6 views
5

voglio avviare un servizio da dentro il widget, so che posso farlo utilizzando PendingIntent comeStart/Stop Servizio presso il Widget

PendingIntent intent = PendingIntent.getService(context, 0, new Intent(context, MyService.class), Intent.FLAG_ACTIVITY_NEW_TASK); 
remoteViews.setOnClickPendingIntent(R.id.buttonWidgetStartService, intent); 

ma il problema è che ho già usato PendingIntent su quel pulsante per qualche altro scopo. Così, ho provato l'avvio del servizio utilizzando

context.startService(new Intent(context, MyService.class)); 

e qui mi sto NullPointerException.

Ecco il mio codice:

public class WiNetWidget extends AppWidgetProvider { 

    public static String TOGGLE_WINET = "ToggleWiNetService"; 
    private static boolean serviceRunning = false; 
    private static Intent serviceIntent; 
    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     final int N = appWidgetIds.length; 
     serviceIntent = new Intent(context, WiNetService.class); 

     for (int i=0; i<N; i++) { 
      int appWidgetId = appWidgetIds[i]; 
      RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_winet); 

      remoteViews.setViewVisibility(R.id.buttonWidgetLoading, View.INVISIBLE); 
      remoteViews.setViewVisibility(R.id.buttonWidgetStartService, View.VISIBLE); 

      Intent newIntent = new Intent(context, WiNetWidget.class); 
      newIntent.setAction(TOGGLE_WINET); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, newIntent, 0); 
      remoteViews.setOnClickPendingIntent(R.id.buttonWidgetStartService, pendingIntent); 
      remoteViews.setOnClickPendingIntent(R.id.buttonWidgetStopService, pendingIntent); 

      appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 
      Log.i(TOGGLE_WINET, "updated"); 
     } 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(TOGGLE_WINET)) { 
      RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_winet); 
      if(serviceRunning) { 
       context.stopService(serviceIntent); 
       remoteViews.setViewVisibility(R.id.buttonWidgetStartService, View.VISIBLE); 
       remoteViews.setViewVisibility(R.id.buttonWidgetStopService, View.INVISIBLE); 
       Toast.makeText(context, "serviceStopped", Toast.LENGTH_SHORT).show(); 
      } else { 
       context.startService(serviceIntent); 
       remoteViews.setViewVisibility(R.id.buttonWidgetStopService, View.VISIBLE); 
       remoteViews.setViewVisibility(R.id.buttonWidgetStartService, View.INVISIBLE); 
       Toast.makeText(context, "serviceStarted", Toast.LENGTH_SHORT).show(); 
      } 
      serviceRunning=!serviceRunning; 
      ComponentName componentName = new ComponentName(context, WiNetWidget.class); 
      AppWidgetManager.getInstance(context).updateAppWidget(componentName, remoteViews); 
     } 
     super.onReceive(context, intent); 
    } 
} 

Nota: Se rimuovo le linee contenenti startService e stopService, tutto fila liscio.

Grazie in anticipo !! :)

+0

Funziona se si utilizza 'context.startService (new Intent (context, MyService.class));' piuttosto che la variabile 'serviceIntent'? –

+0

@ New Townsend: Grazie signore, ha funzionato. Molte grazie!! Puoi spiegare perché non funzionava prima? Grazie ancora. :) –

+0

Vedi sotto per una risposta più completa. –

risposta

2

Il problema è che si crea uno Intent one-shot una volta, ma lo si utilizza più volte. Meglio per creare una nuova Intent ogni volta che si desidera avviare o arrestare il Service come segue:

@Override 
public void onReceive(Context context, Intent intent) { 
    if(intent.getAction().equals(TOGGLE_WINET)) { 
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_winet); 

     // Create a fresh intent 
     Intent serviceIntent = new Intent(context, WiNetService.class); 

     if(serviceRunning) { 
      context.stopService(serviceIntent); 
      remoteViews.setViewVisibility(R.id.buttonWidgetStartService, View.VISIBLE); 
      remoteViews.setViewVisibility(R.id.buttonWidgetStopService, View.INVISIBLE); 
      Toast.makeText(context, "serviceStopped", Toast.LENGTH_SHORT).show(); 
     } else { 
      context.startService(serviceIntent); 
      remoteViews.setViewVisibility(R.id.buttonWidgetStopService, View.VISIBLE); 
      remoteViews.setViewVisibility(R.id.buttonWidgetStartService, View.INVISIBLE); 
      Toast.makeText(context, "serviceStarted", Toast.LENGTH_SHORT).show(); 
     } 
     serviceRunning=!serviceRunning; 
     ComponentName componentName = new ComponentName(context, WiNetWidget.class); 
     AppWidgetManager.getInstance(context).updateAppWidget(componentName, remoteViews); 
    } 
    super.onReceive(context, intent); 
} 
-1
Intent newIntent = new Intent(context, WiNetWidget.class); 
if(newIntent){ 
    //that means your service is already running 
    // stop your service here 
    context.stopService(newIntent); 
}else{ 
    //Its not running 
    //Start your service here 
    context.startService(newIntent); 
} 

provare questo. Grazie

+0

, per favore, spiegate in che modo è diverso dalla risposta esistente e cosa aggiunge alla domanda esistente per risolvere il problema. –

+0

Questo è il breve riassunto di ciò che è richiesto – Fazal