마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

액티비티의 oncreate에서 다른 액티비티oncreate를 호출하려는데..

0 추천
public class camera1 extends Activity {
 SurfaceView cameraPreview;
 SurfaceHolder previewHolder;
 Camera camera;
 boolean inPreview;

 SensorManager sensorManager;

 int accelerometerSensor;

 LocationManager locationManager;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  
  setContentView(R.layout.camera1);
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
  locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
    2000, 2, locationListener);

  sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
  orientationSensor = Sensor.TYPE_ORIENTATION;
  accelerometerSensor = Sensor.TYPE_ACCELEROMETER;
  sensorManager.registerListener(sensorEventListener,
    sensorManager.getDefaultSensor(orientationSensor),
    SensorManager.SENSOR_DELAY_NORMAL);
  sensorManager.registerListener(sensorEventListener,
    sensorManager.getDefaultSensor(accelerometerSensor),
    SensorManager.SENSOR_DELAY_NORMAL);

  inPreview = false;

  cameraPreview = (SurfaceView) findViewById(R.id.cameraPreview);
  previewHolder = cameraPreview.getHolder();
  previewHolder.addCallback(surfaceCallback);
  previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  
 }

 LocationListener locationListener = new LocationListener() {
  public void onLocationChanged(Location location) {
   latitude = location.getLatitude();
   longitude = location.getLongitude();
   altitude = location.getAltitude();
  }

  public void onProviderDisabled(String arg0) {
   // TODO Auto-generated method stub

  }

  public void onProviderEnabled(String arg0) {
   // TODO Auto-generated method stub

  }

  public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
   // TODO Auto-generated method stub

  }
 };

 final SensorEventListener sensorEventListener = new SensorEventListener() {
  public void onSensorChanged(SensorEvent sensorEvent) {
   if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) {
    headingAngle = sensorEvent.values[0];
    pitchAngle = sensorEvent.values[1];
    rollAngle = sensorEvent.values[2];
............................
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


public class MixView extends Activity implements SensorEventListener,LocationListener, OnTouchListener{

 // 카메라 스크린과 증강된 뷰
 private CameraSurface camScreen;
 private AugmentedView augScreen;

 private boolean isInited; // 초기 세팅이 되어 있는가
 private MixContext mixContext; // 메인 컨텍스트
 static PaintScreen dWindow;  // 스크린 윈도우
 static DataView dataView;  // 데이터 뷰
 private Thread downloadThread; // 마커의 내용을 다운로드 할 스레드



 // 센서와 위치 정보를 읽기 위함
 private SensorManager sensorMgr;
 private List<Sensor> sensors;
 private Sensor sensorGrav, sensorMag;
 private LocationManager locationMgr;
 private boolean isGpsEnabled;

 private SeekBar myZoomBar; // 줌 배율을 설정하기 위함
 private WakeLock mWakeLock; // 화면이 점멸되지 않게 하기 위함

 private boolean fError; // 에러 여부
 
 // 나침반 에러
 private int compassErrorDisplayed = 0;

 // 줌 레벨과 프로그레스 수치
 private String zoomLevel;
 private int zoomProgress;
 
 // 리스트 뷰에 쓰일, JSON으로부터 읽어온 타이틀과 URL을 저장할 벡터들 
// private Vector<String> listDataVector;
// private Vector<String> listURL;



 // 뷰 생성시
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  // 초기화
  // 데이터 소스로부터 아이콘 생성
  DataSource.createIcons(getResources());
  
  try {

   handleIntent(getIntent()); // 인텐트 제어

   // 전원관리자
   final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
   // 화면이 꺼지지 않게 하기위한 웨이크 락
   this.mWakeLock = pm.newWakeLock(
     PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "My Tag");
   // 위치관리자의 설정
   locationMgr = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
   // 위치정보 업데이트 설정. 2번째 인자 시간(1/1000s), 3번째 인자 거리(m)에 따라 갱신한다
   locationMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000,10, this);

   killOnError(); // 에러 여부를 체크한다
   requestWindowFeature(Window.FEATURE_NO_TITLE); // 타이틀 바가 없는 윈도우 형태로

   /*내부 메모리에 저장된 프레퍼런스를 불러온다*/
   SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
   SharedPreferences.Editor editor = settings.edit(); // 변경사항을 기록할 에디터

   // 줌 바의 생성과 설정
   myZoomBar = new SeekBar(this);
   myZoomBar.setVisibility(View.INVISIBLE);
   myZoomBar.setMax(100);
   // 프레퍼런스로부터 줌 레벨을 읽는다. 디폴트 값은 65
   myZoomBar.setProgress(settings.getInt("zoomLevel", 65));
   // 체인지 리스너를 등록하고
   myZoomBar.setOnSeekBarChangeListener(myZoomBarOnSeekBarChangeListener);
   myZoomBar.setVisibility(View.INVISIBLE); // 갱신   
   
   // 프레임 레이아웃을 사용한다
   FrameLayout frameLayout = new FrameLayout(this);

   // 카메라 스크린과 증강 스크린을 생성하고
   camScreen = new CameraSurface(this);
   augScreen = new AugmentedView(this);
   setContentView(camScreen); // 카메라 스크린을 컨텐트 뷰로 등록 후

   // 증강 스크린을 덧씌워 준다
   addContentView(augScreen, new LayoutParams(
     LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  ......

 

안녕하세요 안드로이드 공부중인 대학생입니다

현재 증강현실 관련 어플을 제작중인데

camera1 액티비티는 카메라에 레이아웃을 이용해서 이미지뷰에 캐릭터를 띄우는 액티비티

mixview 액티비티는 카메라에 레이아웃을 전혀이용하지않고 건물마커를 띄우는 액티비팅입니다

 

저는 두개를 합쳐서 카메라에 캐릭터와 건물마커를 동시에 띄우고 싶은데하나의 액티비티에서 다른액티비티의 oncreate를 호출하려는 방식으로 하는데 안되네요...ㅠ

센서리스너도 서로 다른방식으로 사용해서 하나의 소스에 몰아가는것도 힘들고 좀 도와주세요..ㅠ

예제도 같이 설명해주시면 더감사합니다..ㅠ

aasda (120 포인트) 님이 2015년 8월 7일 질문

1개의 답변

0 추천

안드로이드에서 액티비티란 하나의 화면을 뜻하는 거로 알고 있습니다. 액티비티 A에서 액티비티 B를 onCreate로 호출한다는 것은 오류를 만들어낼 가능성이 큽니다.

액티비티의 생애주기는, 대략 onCreate onStart onResume (onPaused) onStop onDestroy 의 순서를 가집니다.
출처; http://developer.android.com/reference/android/app/Activity.html

액티비티 생애주기, http://developer.android.com/reference/android/app/Activity.html

액티비티 A에서 액티비티(화면)B로 전환할 때 필요한 메소드가 startActivity() 인 것처럼, 새로운 액티비티를 시작할 때 사용되는 메소드가 따로 있듯이 액티비티의 생애주기는 각각의 역할을 갖고 시작됩니다. onCreate는 레이아웃이 그려졌을 때이거나 그리기 전일 것입니다. 생애주기는 매우 중요하고 예민한 부분입니다. 순서 없이 생애주기 중 하나를 호출하거나 하는 행동은 조심히해야 합니다.

하나의 화면(액티비티)을 여러 개로 분할하기 위해 나온 것이 프레그먼트입니다만 원하는 부분은 아닌 것 같고,
필요한 부분(여기에서는 mixview가 될 수 있다고 봄) 알러트, 팝업, 토스트 등처럼 윈도우의 데코뷰에 뷰를 붙이는 방법을 찾아보시는 것이 좋을 것 같습니다.

강동투 (290 포인트) 님이 2015년 8월 8일 답변
강동투님이 2015년 8월 8일 수정
...