2012-03-04 3 views
1

나는 widget을 이미 가지고 있으며 매 5 초마다 그 위젯을 업데이트하는 service을 가지고있는 응용 프로그램을 가지고 있습니다.AlarmManager LifeCycle 및 취소 오류

여기 내 AppWidgetProvider입니다 :

public class MyWidget extends AppWidgetProvider { 

    PendingIntent service = null; 
    AlarmManager alarmManager; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 

     alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     final Intent i = new Intent(context, MyService.class); 

     if(service == null) { 
      service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); 
     } 

     alarmManager.setRepeating(AlarmManager.RTC, SystemClock.elapsedRealtime(), 1000*5, service); 
    } 

    @Override 
    public void onDisabled(Context context) { 
     Log.d("LogTag", "onDisabled"); 
     alarmManager.cancel(service); 
     service.cancel(); 
    } 
} 

그리고 내 Service :

public class MyService extends Service { 

    int b = 5; 

    @Override 
    public void onCreate() { super.onCreate(); } 

    public int onStartCommand(Intent intent, int flags, int startId) { 
     this.buildUpdate(); 
     return 0; 
    } 

    private void buildUpdate() { 
     Log.d("AAA", "Update is coming"); 

     RemoteViews rmViews = new RemoteViews(getPackageName(), R.layout.widget_layout); 

     rmViews.setTextViewText(R.id.hello, "Iterator: " + Integer.toString(b)); 

     ComponentName thisWidget = new ComponentName(this, MyWidget.class); 

     AppWidgetManager manager = AppWidgetManager.getInstance(this); 

     manager.updateAppWidget(thisWidget, rmViews); 

     b++; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

} 

Service과 다른 일들이 잘됩니다. 하지만 여전히 나는이 모든 것들에 대한 몇 가지 질문을했습니다 :

  1. setRepeating 방법의 매개 변수가 SystemClock.elapsedRealtime()을 위해 무엇? 시작할 때를 가리 킵니까?

  2. 위젯을 삭제하려고하면 아래 오류가 표시되며 불행히도 AlarmManager은 아직 취소되지 않습니다. 내가 뭘 놓치고 있니?

  3. 위젯이 초기화 (또는 호출)되기 전에 일부 네트워크 작업을 수행해야합니다. 위젯에는 서버의 데이터가 있어야합니다. AsyncTask 또는 무엇을 사용해야합니까?

나는 점점 위젯을 삭제하려고하면 :

03-04 23:39:51.428: E/AndroidRuntime(5646): Uncaught handler: thread main exiting due to uncaught exception 
03-04 23:39:51.438: E/AndroidRuntime(5646): java.lang.RuntimeException: Unable to start receiver com.example.widget.MyWidget: java.lang.NullPointerException 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2646) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.app.ActivityThread.access$3100(ActivityThread.java:119) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.os.Looper.loop(Looper.java:123) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at dalvik.system.NativeStart.main(Native Method) 
03-04 23:39:51.438: E/AndroidRuntime(5646): Caused by: java.lang.NullPointerException 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at com.example.widget.MyWidget(MyWidget.java:33) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:76) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2637) 
03-04 23:39:51.438: E/AndroidRuntime(5646):  ... 10 more 

답변

2
  1. SystemClock.elapsedRealTime() 당신은 당신이 착용 할 수는 시간이 있음을 의미하는 triggerAtTime 매개 변수에 현재 가지고있는 당신을 경보가 울리 길 바래. elapsedRealtime()은 시스템이 부팅 된 후 딥 슬립을 포함하여 밀리 초 단위로 계산됩니다. 이 클럭은 시스템 절전 기간에 걸친 시간 간격을 측정 할 때 사용해야합니다.

  2. onDisabled 방법의 경우 전체 PendingIntent을 다시 만들어야합니다. 내 생각 엔 onDisabled을 호출 할 때 실제로 존재하지 않기 때문에 null이되지만, onUpdate에만 존재합니다. 따라서 PendingIntent 변수와 정확히 동일한 방법으로 service 변수를 다시 만든 다음 이미 취소 한 것처럼 취소를 호출하십시오.

  3. AsyncTask 등이 좋습니다. AsyncTask은 백그라운드에서 관리되는 스레드를 생성하고 UI 스레드가 계속 진행되는 동안 작동하며 완료되면 UI 스레드를 업데이트 할 수 있습니다. 따라서 무거운 네트워킹이 많다면 AsyncTask이이를 아름답게 처리 할 것입니다. AsyncTask의 문서는 매우 유용합니다. 그들을 찾으십시오 here. 이 작업에는 수행하는 작업에 따라 여러 가지 옵션이 있으므로이 세 번째 요점에 대한 문제를 좀 더 자세하게 설명해야 더 자세하게 답변 할 수 있습니다.

+0

감사합니다. AsyncTask를 아직 시도하지 않았지만 그것에 대한 단서를 얻었습니다. –