我想從內部部件啓動一個服務,我知道我可以使用的PendingIntent做到像啓動/停止服務從窗口小部件
PendingIntent intent = PendingIntent.getService(context, 0, new Intent(context, MyService.class), Intent.FLAG_ACTIVITY_NEW_TASK);
remoteViews.setOnClickPendingIntent(R.id.buttonWidgetStartService, intent);
但問題是,我已經使用的PendingIntent上按鈕用於其他目的。 於是,我開始嘗試使用
context.startService(new Intent(context, MyService.class));
,在這裏我得到NullPointerException
服務。
這裏是我的代碼:
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);
}
}
注:如果刪除包含startService
和stopService
線條,一切進展順利。
在此先感謝! :)
如果你使用'context.startService(new Intent(context,MyService.class));'而不是變量'serviceIntent',它工作嗎? –
@Neil Townsend:謝謝你,先生,它的工作。非常感謝!!你能解釋一下爲什麼它不工作?再次感謝。 :) –
請參閱下面的更全面的答案。 –