안녕하세요 초보개발자입니다.

 

다름이 아니라 현재 제가 나침반 위젯을 만들었는데요.

나침반 위젯이 평소에는 잘 동작하다가 중간에 전원을 껐다 켜면

동작이 멈추는 현상이 발생합니다.

물론 처음 몇 번은 멈추지 않는데 그 몇번이 지나면 그 이후에는 전원 on/off시

나침반 위젯이 동작을 멈추네요.

메모리 문제라 생각은 되는데 앱 위젯을 제거하지 않고 중간에 강제종료되는 상황에서의

처리가 안된게 아닐까 생각되는데 어떻게 구현을 해야될지 모르곘습니다.

고수님들의 도움을 부탁드립니다.

아래 코드와 log를 적었습니다.

확인부탁드립니다. 감사합니다.

 

===============================================================================

public class MainCompassAppWidgetProvider extends AppWidgetProvider {

 final int UPDATE_MILLIS_INTERVAL = 100;
 static PendingIntent Sender = null;
 static AlarmManager Manager = null;

 //static : 전 class에서 값 공유함
 SensorManager SensorManager = null;
 Sensor Orientation_Sensor = null;
 SensorEventListener Orientation_Listener = null;

 static int Orientation_EventData=0;

 static BitmapDrawable DrawableImage1=null;
 static BitmapDrawable DrawableImage2=null;
 Bitmap Bitmap1=null;
 Bitmap Bitmap2=null;
 Canvas Canvas1=null;
 Canvas Canvas2=null;

 // int sec = 0; 
 // Date d = new Date(System.currentTimeMillis()); 
 // Context context;

 

 public void onReceive(Context context, Intent intent)
 {
  super.onReceive(context, intent);

  String action = intent.getAction();
  // 위젯 업데이트 인텐트를 수신했을 때
  if(action.equals("android.appwidget.action.APPWIDGET_UPDATE"))
  {

   removePreviousAlarm();
   setNewAlarm(context, intent);

  }
  // 위젯 제거 인텐트를 수신했을 때
  else if(action.equals("android.appwidget.action.APPWIDGET_DISABLED"))
  {
   removePreviousAlarm();
  }
 }
 
 @Override
 public void onDisabled(Context context) {
  // TODO Auto-generated method stub
  super.onDisabled(context);
  if(Orientation_EventData!=0){
   Orientation_EventData=0;
  }
  if(DrawableImage1!=null){
   DrawableImage1=null;
  }
  if(DrawableImage2!=null){
   DrawableImage1=null;
  }

  if(SensorManager != null){
   SensorManager = null;
  }

  if(Orientation_Sensor != null){
   Orientation_Sensor = null;
  }

  if( Orientation_Listener != null){
   Orientation_Listener = null;
  }

  if( Bitmap1!=null){
   Bitmap1=null;
  }

  if( Bitmap2!=null){
   Bitmap2=null;
  }

  if(Canvas1!=null){
   Canvas1=null;
  }

  if(Canvas2!=null){
   Canvas2=null;
  }

  Log.e("<---onDisabled--->","onDisabled~!!!!!!!!!");
 }

 
 @Override
 public void onEnabled(Context context) {
  // TODO Auto-generated method stub
  super.onEnabled(context);
  SensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); //SensorManager 인스턴스를 가져옴
  Orientation_Sensor = SensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); // 방향센서
  Orientation_Listener = new eventListener(); //방향센서 Listener instance
  SensorManager.registerListener(Orientation_Listener, Orientation_Sensor, SensorManager.SENSOR_DELAY_GAME);     //방향센서 Listener object 등록

  DrawableImage1 = (BitmapDrawable)context.getResources().getDrawable(R.drawable.img_compass_bg);  
  DrawableImage1.setBounds(0,0,200,200);

  DrawableImage2 = (BitmapDrawable)context.getResources().getDrawable(R.drawable.img_compass_arr);  
  DrawableImage2.setBounds(90,10,110,190);
 }

 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
 {
  // 현재 클래스로 등록된 모든 위젯의 리스트를 가져옴
  appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, getClass()));
  super.onUpdate(context, appWidgetManager, appWidgetIds);

  final int N = appWidgetIds.length;
  for(int i = 0 ; i < N ; i++)
  {
   int appWidgetId = appWidgetIds[i];
   Log.i("<---AppWidgetId--->",Integer.toString(appWidgetId));
   updateAppWidget(context, appWidgetManager, appWidgetId);
  }
 }

 //위젯의 형태를 업데이트합니다.   
 //@param context 컨텍스트
 //@param appWidgetManager 위젯 메니저
 //@param appWidgetId 업데이트할 위젯 아이디

 void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)
 {

  RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.main_compass_activity);

  try{
   Bitmap1 = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
   Canvas1 = new Canvas(Bitmap1);
   DrawableImage1.draw(Canvas1);

   Bitmap2 = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);   
   Canvas2 = new Canvas(Bitmap2);   


   Canvas2.rotate(Orientation_EventData,100,100);
   DrawableImage2.draw(Canvas2);

   updateViews.setImageViewBitmap(R.id.compass_background, Bitmap1);
   updateViews.setImageViewBitmap(R.id.compass_bar, Bitmap2);
   appWidgetManager.updateAppWidget(appWidgetId, updateViews);
  }catch(Exception e){
   e.printStackTrace();  
   Log.e("<---error--->","Exception error is generated~!!!");
  }finally{
   if(Bitmap2 != null){
    Bitmap2.recycle();
    Log.i("Recycle()~~!!!!!","Recycle was completed~!!");
   }
   else if(Bitmap1 !=null){
    Bitmap1.recycle();
   }
  }  
 }

 class eventListener implements SensorEventListener{
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
   // TODO Auto-generated method stub
  }

  public void onSensorChanged(SensorEvent event) {
   // TODO Auto-generated method stub
   Orientation_EventData = -(int)event.values[0];
   if(Orientation_EventData<0){
    Orientation_EventData  = 360+Orientation_EventData;
   }
   else if(Orientation_EventData >=360){
    Orientation_EventData = Orientation_EventData-360;
   }
  } 
 }

 private void setNewAlarm(Context context, Intent intent) {
  // TODO Auto-generated method stub
  long firstTime = System.currentTimeMillis() + UPDATE_MILLIS_INTERVAL;
  Sender = PendingIntent.getBroadcast(context, 0, intent, 0);
  Manager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
  Manager.set(AlarmManager.RTC, firstTime, Sender);
  Log.d("<---setNewAlar--->","Sender and Manager are generated~!!!!");
 }
 
 //예약되어있는 알람을 취소합니다.
 public void removePreviousAlarm()
 {
  if(Manager != null && Sender != null)
  {
   Sender.cancel();
   Manager.cancel(Sender);
   Log.w("<---removePreviousAlarm()--->","Sender and Manager are canceled~!!!!");
  }
 }
}

===============================================================================

 

===============================================================================

06-25 22:55:29.692: E/<---error--->(4793): Exception error is generated~!!!
06-25 22:55:29.697: W/<---removePreviousAlarm()--->(4793): Sender and Manager are canceled~!!!!
06-25 22:55:29.702: D/<---setNewAlar--->(4793): Sender and Manager are generated~!!!!
06-25 22:55:29.802: I/<---AppWidgetId--->(4793): 410
06-25 22:55:29.807: W/System.err(4793): java.lang.NullPointerException
06-25 22:55:29.807: W/System.err(4793):  at com.sec.CompassWidget2.MainCompassAppWidgetProvider.updateAppWidget(MainCompassAppWidgetProvider.java:158)
06-25 22:55:29.812: W/System.err(4793):  at com.sec.CompassWidget2.MainCompassAppWidgetProvider.onUpdate(MainCompassAppWidgetProvider.java:141)
06-25 22:55:29.812: W/System.err(4793):  at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:61)
06-25 22:55:29.817: W/System.err(4793):  at com.sec.CompassWidget2.MainCompassAppWidgetProvider.onReceive(MainCompassAppWidgetProvider.java:50)
06-25 22:55:29.817: W/System.err(4793):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2131)
06-25 22:55:29.817: W/System.err(4793):  at android.app.ActivityThread.access$1500(ActivityThread.java:127)
06-25 22:55:29.817: W/System.err(4793):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1209)
06-25 22:55:29.822: W/System.err(4793):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-25 22:55:29.822: W/System.err(4793):  at android.os.Looper.loop(Looper.java:137)
06-25 22:55:29.822: W/System.err(4793):  at android.app.ActivityThread.main(ActivityThread.java:4507)
06-25 22:55:29.827: W/System.err(4793):  at java.lang.reflect.Method.invokeNative(Native Method)
06-25 22:55:29.827: W/System.err(4793):  at java.lang.reflect.Method.invoke(Method.java:511)
06-25 22:55:29.827: W/System.err(4793):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
06-25 22:55:29.827: W/System.err(4793):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
06-25 22:55:29.832: W/System.err(4793):  at dalvik.system.NativeStart.main(Native Method)

=================================================================================