ウィジェット内からサービスを開始したいのですが、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
、すべてがスムーズに実行されます。
前もって感謝します!!:)