안녕하십니까 초보개발자입니다.
다름이 아니라 제목에서 보듯이 실시간으로 센서정보를 받아서 앱위젯으로 띄우려 하는데 잘 되지 않네요.
위젯의 경우, 최소 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) {
}
}
}
===================================================================================




음? 이런 방식이 가능한가요? (제가 고수가 아니라서..)
저는 Service 만들어서 센서값 받고, 업데이트 할때
sendBroadcast 날리면 AppWidgetProvider 에서 그리는 방법으로 만들었습니다.