안녕하십니까 초보개발자입니다.

 

다름이 아니라 제목에서 보듯이 실시간으로 센서정보를 받아서 앱위젯으로 띄우려 하는데 잘 되지 않네요.

위젯의 경우, 최소 30분 단위로 update가 되기때문에 service를 통해서 업데이트를 하려고 설정했는데

제가 코드에 대한 이해가 짧다보니 그냥 갖다 붙이기만 하니 실시간으로 정보가 뜨진 않고

FC만 발생하는 거 같습니다

혹시 이 부분에 대해 아시는 고수 개발자분 계시면 답변주시면 감사하겠습니다.

코드는 아래와 같습니다.

(참고로 위젯이라는 거 다시 말씀드리고 xml 파일은 생략합니다.)

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

package com.sec.SensorTestWidget;


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.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.widget.RemoteViews;

public class SensorTestWidget extends AppWidgetProvider {
 /** Called when the activity is first created. */
 SensorManager sm;
 SensorEventListener oriL;   
 Sensor oriSensor;
 String ox, oy, oz;
 public static int curCount = 0;
 public static boolean endServiceFlag = false;

 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
  // TODO Auto-generated method stub
  super.onUpdate(context, appWidgetManager, appWidgetIds);
  Intent intent = new Intent(context, UpdateService.class);
  context.startService(intent);   
 }

 public class UpdateService extends Service implements Runnable{
  
  private Handler mHandler;
  private static final int TIMER_PERIOD = 1 * 1000;

  private long preTime;
  private long curTime;
  
  @Override
  public void onCreate(){
   mHandler = new Handler();
  }
  
  @Override
  public void onStart(Intent intent, int startId) {
   // TODO Auto-generated method stub
   super.onStart(intent, startId);
   preTime = System.currentTimeMillis();// - DAY_TIME;
   
   mHandler.postDelayed(this, 1000);    
  }

  @Override
  public IBinder onBind(Intent intent) {
   // TODO Auto-generated method stub
   return null;
  }

  @Override
  public void run() {
   // TODO Auto-generated method stub
   curTime = System.currentTimeMillis();
   
   sm = (SensorManager)this.getSystemService(Context.SENSOR_SERVICE);    // SensorManager 인스턴스를 가져옴           
   oriSensor = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);    // 방향 센서
   oriL = new oriListener();        // 방향 센서 리스너 인스턴스

   RemoteViews remoteviews = new RemoteViews(this.getPackageName(),R.layout.main);
   long CUR_PERIOD = curTime - preTime;
   if( CUR_PERIOD > 1000 ){
    remoteviews.setTextViewText(R.id.ori_x, ox);
    remoteviews.setTextViewText(R.id.ori_y, oy);
    remoteviews.setTextViewText(R.id.ori_z, oz);
    preTime = curTime;
    curCount++;
   }
   
   ComponentName componentname = new ComponentName(this, SensorTestWidget.class);
   AppWidgetManager appwidgetmanager = AppWidgetManager.getInstance(this);
   appwidgetmanager.updateAppWidget(componentname, remoteviews);
   
   if(endServiceFlag){
    return;
   }else{
    mHandler.postDelayed(this, TIMER_PERIOD);
   }
   
  }
 }
 
 @Override
 public void onDisabled(Context context) {
  // TODO Auto-generated method stub
  super.onDisabled(context);
  sm.unregisterListener(oriL);    // unregister orientation listener
 }
 @Override
 public void onEnabled(Context context) {
  // TODO Auto-generated method stub
  super.onEnabled(context);
  sm.registerListener(oriL, oriSensor, SensorManager.SENSOR_DELAY_NORMAL); // 방향 센서 리스너 오브젝트를 등록
 }

 private class oriListener implements SensorEventListener {
  public void onSensorChanged(SensorEvent event) {  // 방향 센서 값이 바뀔때마다 호출됨
   ox = Float.toString(event.values[0]);
   oy = Float.toString(event.values[1]);
   oz = Float.toString(event.values[2]);
   Log.i("SENSOR", "Orientation changed.");
   Log.i("SENSOR", "  Orientation X: " + event.values[0]
     + ", Orientation Y: " + event.values[1]
       + ", Orientation Z: " + event.values[2]);
  }

  public void onAccuracyChanged(Sensor sensor, int accuracy) {

  }
 } 
}

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