2013-03-25 2 views
0

네비게이션 활동이 실행되는 동안 백그라운드에서 실행될 서비스를 시작하려고합니다. 문제는 서비스가 시작되지 않는 것입니다. 응용 프로그램이 충돌하지 않고 내가 말할 수있는 한 서비스를 시작하려고 시도하지만 아무 일도 일어나지 않는 것 같습니다. 누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까? 또한 로컬 브로드 캐스터를 사용하여 서비스에서 호출 활동으로 데이터 문자열을 보내려고합니다. 올바르게 구현 했습니까? 마지막으로 run()을 실행하기 위해 Navigation 액티비티를 얻는 것 같습니다. 이렇게하는 가장 좋은 방법은 무엇입니까 그래서 run()은 액티비티가 닫힐 때까지 반복적으로 호출됩니까?서비스 시작이 없습니다.

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

public void call_ioio(View v) 
{ 
    Intent intent = new Intent(this, AugiActivity.class); 
    startActivity(intent); 
} 

public void navigation(View v) 
{ 
    System.out.println("Got to Mainactivity start Navigation"); 
    Intent intent = new Intent(this, Navigation.class); 
    startActivity(intent); 
} 

}

:이 안드로이드 응용 프로그램을 만드는에서 내 첫 번째 시도, 그래서 초보자의 관점에서 설명 : 감사에게

을 참고 MainActivity는

MainActivity 서비스 AugiActivity을 시작 탐색 활동, 시작

내비게이션 활동 :

public class Navigation extends MapActivity implements Runnable, 
SurfaceHolder.Callback{ 

String LED = null; 
String MAG = null; 
String BAR = null; 
String GYRO = null; 
String EULER = null;  
String GGA = null; 

private BroadcastReceiver MessageReceiver = new BroadcastReceiver() 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     LED = intent.getStringExtra("LED"); 
     MAG = intent.getStringExtra("MAG"); 
     BAR = intent.getStringExtra("BAR"); 
     GYRO = intent.getStringExtra("GYRO"); 
     EULER = intent.getStringExtra("EULER"); 
     GGA = intent.getStringExtra("GGA"); 
     run(); 
    } 
}; 

boolean previewing = false; 
boolean map_view = true; 
boolean cam_view = false; 
boolean sen_view = false; 

LinearLayout SS; 
SurfaceView CC; 
MapView MM; 

TextView light_voltage_TV; 
TextView bar_data_TV; 
TextView mag_TV; 
TextView gyro_TV; 
TextView gyro_rate_TV; 
TextView acel_TV; 
TextView acel_euler_TV; 
TextView gga_TV; 
TextView gsa_TV; 
TextView gsv_TV; 
TextView rmc_TV; 
TextView vtg_TV; 

// CAMERA VARIABLES 
    Camera cam; 
    SurfaceView cam_TV; 
    SurfaceHolder holder;  

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_navigation); 
    MapView mapview = (MapView) findViewById(R.id.mapview); 
    mapview.setBuiltInZoomControls(true); 

    getWindow().setFormat(PixelFormat.UNKNOWN); 

    cam_TV = (SurfaceView) findViewById(R.id.CAMERA_View); 
    holder = cam_TV.getHolder(); 
    holder.addCallback((Callback) this); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    LocalBroadcastManager.getInstance(this).registerReceiver(MessageReceiver, 
      new IntentFilter("IOIOData")); 

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

      // Lots of linking view variables to xml views here 

    System.out.println("Got to Navigation OnCreate"); 
    startService(new Intent(this, AugiActivity.class));  
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_navigation, menu); 
    return true; 
} 

@Override 
protected boolean isRouteDisplayed() { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

} 

public void sensorLayer(View v) 
{ 
    // set view visable/invisible 
} 

public void mapLayer(View v) 
{ 
    //set view visable/invisible 
} 

public void cameraLayer(View v) 
{ 
    //set view visable/invisible 
} 

@Override 
public void run() { 
    System.out.println("Got to Navigation RUN"); 

    //update text views with string data 
} 
} 

AugiActivity :

public class AugiActivity extends Service { 

public Activity activity_name; 

class IOIO extends IOIOActivity { 


// Various unrelated global variables 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    activity_name = this.getParent(); 
    System.out.println("Got to AugiActivity OnCreate"); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present.   
    return true; 
} 

class Looper extends BaseIOIOLooper { 

    public Activity activity_name; 

    Looper(Activity x) 
    { 
     this.activity_name = x; 
    }  

    // Communication variables 

    /** 
    * Called every time a connection with IOIO has been established. 
    * Typically used to open pins. 
    * 
    * @throws ConnectionLostException 
    *    When IOIO connection is lost. 
    * @throws InterruptedException 
    * 
    * @see ioio.lib.util.AbstractIOIOActivity.IOIOThread#setup() 
    */ 
     @Override 
     protected void setup() throws ConnectionLostException, 
InterruptedException 
     { 
      // OPEN LIGHT SENSOR PINS 


      // ESTABLISH I2C CONNECTION 


      // ESTABLISH UART CONNECTION     

      bar_calibration();  
      mag_setup(); 
      imu_setup();  
      try { 
       gps_setup(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     // BAROMETER CALIBRATION METHOD 
     private void bar_calibration() 
     { 
      // do setup 
     } 

     // MAGNETOETER SETUP METHOD 
     private void mag_setup() 
     { 
      // do setup 
     } 

     // IMU SETUP METHOD 
     private void imu_setup() 
     { 
      // do setup 
     } 

     private void gps_setup() throws IOException, InterruptedException 
     {    
      // do setup  
     } 

    /** 
    * Called repetitively while the IOIO is connected. 
    * 
    * @throws ConnectionLostException 
    *    When IOIO connection is lost. 
    * @throws InterruptedException 
    * 
    * @see ioio.lib.util.AbstractIOIOActivity.IOIOThread#loop() 
    */ 


    @Override 
     public void loop() throws ConnectionLostException, 
InterruptedException 
     {   
      get_light(); 

      get_temp(); 

      get_pressure(); 

      get_north(); 

      get_imu(); 

      System.out.println("Got to AugiActivity LOOP"); 
      try { 
       get_gps(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      led_.write(true); 

      sendMessage(); 
     } 

     private void get_light() 
     { 
      // get data 
     } 

     private void get_temp() 
     { 
      // get data 
     } 

     private void get_pressure() 
     { 
      // get data 
     } 

     private void get_north() 
     { 
      // get data 
     } 

     private void get_imu() 
     { 
      // get data 
     } 

     private void get_gps() throws IOException, InterruptedException 
     { 
      // get data 
      } 

     private void sendMessage() 
     { 
      Intent intent = new Intent("IOIOData");  

      intent.putExtra("LED", get_LED()); 

LocalBroadcastManager.getInstance(activity_name).sendBroadcast(intent); 

      intent.putExtra("MAG", get_MAG()); 

LocalBroadcastManager.getInstance(activity_name).sendBroadcast(intent); 

      intent.putExtra("BAR", get_BAR()); 

LocalBroadcastManager.getInstance(activity_name).sendBroadcast(intent); 

      intent.putExtra("GYRO", get_GYRO()); 

LocalBroadcastManager.getInstance(activity_name).sendBroadcast(intent); 

      intent.putExtra("EULER", get_EULER()); 

LocalBroadcastManager.getInstance(activity_name).sendBroadcast(intent); 

      intent.putExtra("GGA", gps_GGA); 

LocalBroadcastManager.getInstance(activity_name).sendBroadcast(intent); 
     } 
    } 
    /** 
    * A method to create our IOIO thread. 
    * 
    * @see ioio.lib.util.AbstractIOIOActivity#createIOIOThread() 
    */ 
    @Override 
    protected IOIOLooper createIOIOLooper() { 
     return new Looper(activity_name); 
    }  

    public String get_LED() 
    { 
     // code here    
    } 

    public String get_MAG() 
    { 
     // code here 
    } 

    public String get_BAR() 
    { 
     // code here    
    } 

    public String get_GYRO() 
    { 
     // code here    
    } 

    public String get_EULER() 
    { 
     // code here    
    } 

    public String get_GPS() 
    { 
     // code here    
    } 

} 

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

여전히 여기에 붙어 있습니다. 이 문제를 어떻게 해결할 수 있는지 조언 해 주시겠습니까? –

답변

0

나는 전문가는 아니지만 여기에는 서비스 내의 활동이 있습니다. startService()으로 Intent으로 전화하여 AugiActivity (이 종류의 이름을 알려주지 않음) 서비스를 시작합니다.

내가보기에 문제는 서비스의 onCreate(), onStartCommand()onDestroy() 개의 메소드를 구현하지 않았다는 것입니다. 이 방법에서는 여기에있는 중첩 된 객체의 라이프 사이클을 관리 할 수 ​​있습니다.

어쨌든, 나는 서비스 내에서 활동하는 것이 정말로 깨끗한 것은 아니라고 생각합니다. 당신의 목적은 정확히 무엇입니까? 왜 당신은 중첩 된 활동을합니까? 레이아웃을 갖고 있지 않은 것 같습니다 (어쩌면 놓쳤을 지 모르지만 많은 코드가 있습니다! : D). 따라서 중첩 된 클래스의 모든 것을 수행하는 대신 서비스 자체에 머물러 있지 않은 이유는 무엇입니까?

백그라운드 서비스와 통신하는 사용자 인터페이스를 원할 경우 서비스에 바인딩하는 활동을 사용할 수 있습니다 (단, 서비스에 대해 하나, 인터페이스가있는 활동에 대해 하나씩) . Android 개발자 가이드에서 bound services을보세요.