안드로이드 개발 질문/답변
(글 수 45,052)
앱위젯에서 view갱신을 서비스로 처리하였습니다.
에뮬에서는 설치후 다시 코드를 조금 수정하고 다시 에뮬타겟으로 실행시키더라도 앱오류가 발생하지 않는데,
폰에서는 설치한후 코드 수정하고 폰타겟으로 실행날리면 어김없이 앱이 ..오류가 발생했다는 메시지가 뜹니다.
서비스가 아마 죽어버리는거 같은데, 로그캣보면 null ex때문에 서비스가 실행안되서 나는것 같습니다.
이것 이후에 윗젯을 지웠다 다시 위젯을 홈스크린에 올려도 서비스가 비정상적으로 시작되지 않았기에...처리가 안됩니다. --;
에뮬에서 한번 발생한 오류가 있는데, 왜 색칠한부분에서 null이 날수 있는지 좀 가르침을 주시길...
위젯 class.
-----------------
public class MySimpleWidget extends AppWidgetProvider {
static final String TAG = "xxx";
static final String TAG1 = "xxx1";
private static AppWidgetManager appWidgetManager;
Intent intent;
protected static PendingIntent pendingIntent;
protected static AlarmManager alarmManager;
public void onReceive(Context context, Intent intent) {
// Protect against rogue update broadcasts (not really a security issue,
// just filter bad broacasts out so subclasses are less likely to
// crash).
Log.d(TAG1, "onReceive ");
String action = intent.getAction();
if (action.equals("CLICK_RELOAD")) {
Log.d(TAG, "ACTION_CLICK_RELOAD");
Toast.makeText(context, "Data Collecting", Toast.LENGTH_SHORT).show();
xmlViewParser(context);
} else if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
Log.d(TAG, "ACTION_APPWIDGET_UPDATE");
Toast.makeText(context, "최초자동업데이트중...", Toast.LENGTH_SHORT).show();
Bundle extras = intent.getExtras();
if (extras != null) {
int[] appWidgetIds = extras
.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
if (appWidgetIds != null && appWidgetIds.length > 0) {
this.onUpdate(context, AppWidgetManager
.getInstance(context), appWidgetIds);
}
}
} else if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
Log.d(TAG, "ACTION_APPWIDGET_DELETED");
final int appWidgetId = intent.getExtras().getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
this.onDeleted(context, new int[] { appWidgetId });
}
/*
* Bundle extras = intent.getExtras(); if (extras != null &&
* extras.containsKey(AppWidgetManager.EXTRA_APPWIDGET_ID)) { final
* int appWidgetId = extras
* .getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
* this.onDeleted(context, new int[] { appWidgetId }); }
*/
} else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) {
Log.d(TAG, "ACTION_APPWIDGET_ENABLED");
this.onEnabled(context);
} else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) {
Log.d(TAG, "ACTION_APPWIDGET_DISABLED");
this.onDisabled(context);
} else {
super.onReceive(context, intent);
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
super.onUpdate(context, appWidgetManager, appWidgetIds);
Log.d(TAG1, "onUpdate");
if (appWidgetIds == null) {
appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(
context, MySimpleWidget.class));
}
if (appWidgetIds == null) {
Log.d(TAG, "onUpdate appwidgetIds is null");
return;
}
final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
this.appWidgetManager = appWidgetManager;
UpdateService.regAppWidgetIds(context, appWidgetId);
// updatePeriodMillis 옵션 미사용시 아래 이용
StartUpdate(context, appWidgetId);
// updatePeriodMillis 옵션 사용시
//xmlViewParser(context);
}
}
public static void StartUpdate(Context context, int appWidgetsIds) {
Intent updateIntent = new Intent(context, UpdateService.class);
pendingIntent = PendingIntent.getService(context, 0,
updateIntent, 0);
if (pendingIntent == null)
Log.e(TAG, "pendingIntent is null");
else
Log.e(TAG, "pendingIntent is not null");
Calendar cal = Calendar.getInstance();
// Schedule alarm, and force the device awake for this update
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
int delay = 3000; // 10초: 10000 / 30분: 1800000
alarmManager.setRepeating(AlarmManager.RTC, cal.getTimeInMillis(), delay, pendingIntent);
}
public static void EndUpdate(Context context) {
alarmManager.cancel(pendingIntent);
Intent endIntent = new Intent(context, UpdateService.class);
context.stopService(endIntent);
}
public static void xmlViewParser(Context context) {
// TODO Auto-generated method stub
RemoteViews remoteViews;
RemoteViews goViews;
ComponentName watchWidget;
// TODO Auto-generated method stub
remoteViews = new RemoteViews(context.getPackageName(),
R.layout.simple_widget_layout);
goViews = new RemoteViews(context.getPackageName(),
R.layout.simple_widget_layout);
//....UI처리
remoteViews.setTextViewText(R.id.simple_widget_layout_text,"Yes1!");
remoteViews.setTextViewText(R.id.simple_widget_layout_text1,"Yes2!");
// goViews.setTextViewText(R.id.simple_widget_layout_text,"Yes1!");
// goViews.setTextViewText(R.id.simple_widget_layout_text1,"Yes2!");
SimpleDateFormat formatStr = new SimpleDateFormat("HH:mm:ss", Locale.KOREA);
Date d = new Date();
String date1 = formatStr.format(d);
remoteViews.setTextViewText(R.id.simple_widget_layout_text2,date1);
// goViews.setTextViewText(R.id.simple_widget_layout_text2,date1);
//...UI처리끝
//reload처리
Intent intent = new Intent(context, MySimpleWidget.class);
intent.setAction("CLICK_RELOAD");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,intent, 0);
remoteViews.setOnClickPendingIntent(R.id.widget, pendingIntent);
watchWidget = new ComponentName(context, MySimpleWidget.class);
appWidgetManager.updateAppWidget(watchWidget, remoteViews);
//뻔잉웹뷰로 점핑.. 나중에 메소드레벨로 뽑을것
Intent intent1 = new Intent(context, English.class);
PendingIntent pi = PendingIntent.getActivity(context, 0, intent1, Intent.FLAG_ACTIVITY_NEW_TASK);
goViews.setOnClickPendingIntent(R.id.content, pi);
watchWidget = new ComponentName(context, MySimpleWidget.class);
appWidgetManager.updateAppWidget(watchWidget, goViews);
}
/* 위젯이 삭제될때 마다 호출됨.
* 위젯이 삭제될때마다 서비스를 stop 시킨다. ( 이는 알람도 취소 시킨다는 뜻 )
*
* 참고 : 위젯이 삭제 될때마다 서비스가 stop되니 미니티가 실행되건, 알람이 터치되건
* 사용자 액션이 있을때마다 서비스를 다시 시작 시킨다.
* @see android.appwidget.AppWidgetProvider#onDisabled(android.content.Context)
*/
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
Log.d(TAG1, "onDeleted");
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
Log.d(TAG1, "onDisabled");
EndUpdate(context);
}
/* 위젯을 종류에 따라 처음 만들때 호출됨
* ( 1x1을 처음 생성하면 호출됨, 두번째 생성하면 호출 안됨(이때는 onUpdate가 호출됨.
* 1x1을 생성한 상태여도 다른종류인 2x1을 생성 하면 호출됨 )
* 여기서 서비스를 start하여 alarm도 깨운다.
* @see android.appwidget.AppWidgetProvider#onEnabled(android.content.Context)
*/
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
Log.d(TAG1, "onEnabled");
}
}
---------
서비스 class
public class UpdateService extends Service {
private static Context context;
private static int sAppWidgetIds;
private static final String TAG = "seo";
// private DateFormat format = SimpleDateFormat.getTimeInstance(
// SimpleDateFormat.MEDIUM, Locale.getDefault());
// public void onStart(Intent intent, int startId) {
// super.onStart(intent, startId);
//
// SimpleDateFormat formatStr = new SimpleDateFormat("HHmm", Locale.KOREA);
// Date d = new Date();
//
// String date1 = formatStr.format(d);
//
// Log.i(TAG, " Onstart: " + " ... " + date1);
// MySimpleWidget.xmlViewParser(context);
// }
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
SimpleDateFormat formatStr = new SimpleDateFormat("HH:mm:ss",
Locale.KOREA);
Date d = new Date();
String date1 = formatStr.format(d);
Log.i(TAG, " OnstartCommand: " + " ... " + date1);
MySimpleWidget.xmlViewParser(context);
return START_STICKY;
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
public static void regAppWidgetIds(Context _context, int widgetIds) {
context = _context;
sAppWidgetIds = widgetIds;
}
}
---
로그캣 로그입니다.
04-15 09:28:16.445: ERROR/ActivityThread(53): Failed to find provider info for android.server.checkin
04-15 09:28:16.764: ERROR/AndroidRuntime(711): ERROR: thread attach failed
04-15 09:28:18.373: ERROR/AndroidRuntime(721): Uncaught handler: thread main exiting due to uncaught exception
04-15 09:28:18.624: ERROR/AndroidRuntime(721): java.lang.RuntimeException: Unable to start service com.skcc.english.UpdateService@43d0f780 with Intent { flg=0x4 cmp=com.skcc.english/.UpdateService (has extras) }: java.lang.NullPointerException
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2882)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at android.app.ActivityThread.access$3500(ActivityThread.java:119)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at android.os.Handler.dispatchMessage(Handler.java:99)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at android.os.Looper.loop(Looper.java:123)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at android.app.ActivityThread.main(ActivityThread.java:4363)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at java.lang.reflect.Method.invokeNative(Native Method)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at java.lang.reflect.Method.invoke(Method.java:521)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at dalvik.system.NativeStart.main(Native Method)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): Caused by: java.lang.NullPointerException
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at com.skcc.english.MySimpleWidget.xmlViewParser(MySimpleWidget.java:148)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at com.skcc.english.UpdateService.onStartCommand(UpdateService.java:45)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2873)
04-15 09:28:18.624: ERROR/AndroidRuntime(721): ... 10 more
04-15 09:28:23.025: ERROR/ActivityThread(53): Failed to find provider info for android.server.checkin
04-15 09:28:23.054: ERROR/gralloc(53): [unregister] handle 0x37a1c8 still locked (state=40000001)
04-15 09:28:33.255: ERROR/AndroidRuntime(727): Uncaught handler: thread main exiting due to uncaught exception
04-15 09:28:33.274: ERROR/AndroidRuntime(727): java.lang.RuntimeException: Unable to start service com.skcc.english.UpdateService@43d0f000 with Intent { flg=0x4 cmp=com.skcc.english/.UpdateService (has extras) }: java.lang.NullPointerException
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2882)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at android.app.ActivityThread.access$3500(ActivityThread.java:119)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at android.os.Handler.dispatchMessage(Handler.java:99)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at android.os.Looper.loop(Looper.java:123)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at android.app.ActivityThread.main(ActivityThread.java:4363)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at java.lang.reflect.Method.invokeNative(Native Method)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at java.lang.reflect.Method.invoke(Method.java:521)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at dalvik.system.NativeStart.main(Native Method)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): Caused by: java.lang.NullPointerException
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at com.skcc.english.MySimpleWidget.xmlViewParser(MySimpleWidget.java:148)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at com.skcc.english.UpdateService.onStartCommand(UpdateService.java:45)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2873)
04-15 09:28:33.274: ERROR/AndroidRuntime(727): ... 10 more
04-15 09:31:01.954: ERROR/AndroidRuntime(735): ERROR: thread attach failed
04-15 09:31:03.205: ERROR/seo(745): pendingIntent is not null
04-15 09:31:45.994: ERROR/ActivityThread(53): Failed to find provider info for android.server.checkin
04-15 09:31:46.195: ERROR/AndroidRuntime(753): ERROR: thread attach failed
04-15 09:31:47.815: ERROR/seo(763): pendingIntent is not null
04-15 09:33:00.283: ERROR/ActivityThread(53): Failed to find provider info for android.server.checkin
04-15 09:33:00.464: ERROR/AndroidRuntime(771): ERROR: thread attach failed
04-15 09:33:02.094: ERROR/seo(781): pendingIntent is not null
04-15 09:36:45.415: ERROR/AndroidRuntime(788): ERROR: thread attach failed
04-15 09:36:55.975: ERROR/ActivityThread(53): Failed to find provider info for android.server.checkin
04-15 09:36:56.155: ERROR/AndroidRuntime(797): ERROR: thread attach failed