나는 일련의 이미지를 넘겨주는 간단한 버튼 위젯을 가지고 있습니다. 이제 버튼 클릭 대신 시간의 일정한 간격 후에 이미지가 뒤집히는 것이 좋습니다. 그것을 위해 서비스 클래스가 필요합니다. 누구든지 내 코드에 포함시키는 방법을 알려줄 수 있습니까? 서비스에 대해별로 생각하지 않습니다. 여기 android 서비스를 사용하여 위젯 업데이트
내 코드입니다 : //widgetprovider.javapublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds){
//Log.i("Tag","In onUpdate method");
System.out.println("Tag In onUpdate method");
RemoteViews views=new RemoteViews(context.getPackageName(),R.layout.widget_layout);
views.setOnClickPendingIntent(R.id.widget_button, buildButtonPendingIntent(context));
Log.i("Tag","Context value after setOnClickPI before pushWIDGET:"+context);
pushWidgetUpdate(context,views);
Log.i("Tag","after pushwidget update:"+context);
}
public static PendingIntent buildButtonPendingIntent(Context context){
Intent intent=new Intent();
intent.setAction("com.example.android.intent.action.CHANGE_PICTURE");
Log.i("Tag","intent's action:"+intent);
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
public static void pushWidgetUpdate(Context context,RemoteViews views){
System.out.println("Inside pushwidget");
ComponentName myWidget=new ComponentName(context, MyWidgetProvider.class);
AppWidgetManager manager=AppWidgetManager.getInstance(context);
manager.updateAppWidget(myWidget, views);
}
//IntentReceiver.java
public void onReceive(Context context, Intent intent) {
// Log.i("Tag1","In onReceive:"+intent);
System.out.println("In onReceive()");
if (intent.getAction().equals(
"com.example.android.intent.action.CHANGE_PICTURE")) {
updateWidgetPictureAndButtonListener(context);
}
}
private void updateWidgetPictureAndButtonListener(Context context) {
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
views.setImageViewResource(R.id.widget_image, getImageToSet());
System.out.println("in updateWidgetPicture method");
// Log.i("Tag","in updaeWIdgetPicture method");
// remember to set ur button click listeners
views.setOnClickPendingIntent(R.id.widget_button,
MyWidgetProvider.buildButtonPendingIntent(context));
MyWidgetProvider.pushWidgetUpdate(context.getApplicationContext(),
views);
}
// 편집 자바 파일
package com.example.pictureappservice;
import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.RemoteViews;
// this works without service
public class MyWidgetProvider extends AppWidgetProvider {
private static int clickCount = 0;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds){
Log.i("onUpdate method call","Called");
ComponentName thisWidget=new ComponentName(context, MyWidgetProvider.class);
int []allWidgetIds=appWidgetManager.getAppWidgetIds(thisWidget);
//built intent to call service
Intent intent=new Intent(context.getApplicationContext(),UpdateService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,allWidgetIds);
Log.i("LOG","before service");
//update widget via service
context.startService(new Intent(context,UpdateService.class));
}
public static class UpdateService extends Service{
public void onStart(Intent intent, int startId){
AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(this.getApplicationContext());
int []allWidgetIds=intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
ComponentName thisWidget=new ComponentName(getApplicationContext(),MyWidgetProvider.class);
int []allWidgetIds2=appWidgetManager.getAppWidgetIds(thisWidget);
Log.i("LOG","From Intent" + String.valueOf(allWidgetIds.length));
Log.i("LOG","Direct" + String.valueOf(allWidgetIds2.length));
for(int widgetId:allWidgetIds){
// logic
Log.i("LOG","intent's action"+intent.getAction());
//if (intent.getAction().equals("com.example.android.intent.action.CHANGE_PICTURE")) {
RemoteViews views=new RemoteViews(this.getApplicationContext().getPackageName(),R.layout.widget_layout);
views.setImageViewResource(R.id.widget_image, getImageToSet());
//intent
Intent clickIntent=new Intent(this.getApplicationContext(),MyWidgetProvider.class);
clickIntent.setAction("AppWidgetManager.ACTION_APPWIDGET_UPDATE");
//clickIntent.setAction("com.example.android.intent.action.CHANGE_PICTURE");
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
Log.i("Tag","intent's action:"+intent);
PendingIntent pendingIntent=PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.widget_image, pendingIntent);
appWidgetManager.updateAppWidget(widgetId,views);
//}
}
stopSelf();
super.onStart(intent, startId);
}
private int getImageToSet() {
clickCount++;
Log.i("Tag", "in getImageToSet()" + clickCount);
return clickCount % 2 == 0 ? R.drawable.paypal_logo : R.drawable.paypaldonation;
}
@Override
public IBinder onBind(Intent intent) {
// We don't need to bind to this service
return null;
}
}
public static void pushWidgetUpdate(Context context,RemoteViews views){
System.out.println("Inside pushwidget");
ComponentName myWidget=new ComponentName(context, MyWidgetProvider.class);
AppWidgetManager manager=AppWidgetManager.getInstance(context);
manager.updateAppWidget(myWidget, views);
}
}
서비스 클래스를 추가하기위한 코드가 추가 및 수정되었습니다. 제 편집 된 코드를보십시오. "불행히도 서비스가 중지되었습니다"라는 오류가 나타납니다. – Atihska
@Atihska : LogCat을 검사하여 오류와 관련된 스택 추적을보십시오. – CommonsWare