2013-03-25 264 views
0

我試圖獲得一個服務,只要導航活動正在運行,就會在後臺運行。麻煩的是該服務似乎並未開始。應用程序不會崩潰,它儘可能地嘗試啓動服務,但似乎沒有發生。有人能告訴我我做錯了什麼嗎?此外,我試圖使用本地廣播公司從服務向調用活動發送數據串,我是否正確實施了它?最後,我似乎無法讓導航活動執行run(),那麼執行此操作的最佳方式是什麼,以便在活動關閉之前重複調用run()?這是我在做一個Android應用程序第一次嘗試,所以在新手術語解釋:)謝謝服務不會啓動

FYI MainActivity啓動導航活動,啓動服務AugiActivity

MainActivity:

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); 
} 

}

導航活動:

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

我仍然陷在這裏。有關如何解決此問題的任何建議? – 2013-03-26 19:53:19

回答

0

我不是專家,但在這裏你有一個服務內的活動。 您撥打電話startService()Intent開始AugiActivity這是一項服務(難以遵循這種名稱)。

我看到的問題是,您甚至沒有實施您的服務的onCreate()onStartCommand()onDestroy()方法。在這種方法中,您可以管理您在此處嵌套對象的生命週期。

無論如何,我相信有一個服務內的活動是不是真的乾淨。你的目的究竟是什麼?爲什麼你有一個嵌套的活動?你似乎沒有任何佈局(也許我錯過了它,但是有很多代碼!:D),那麼爲什麼不直接停留在服務本身中,而不是在嵌套類中執行所有操作?

如果您希望有一個與後臺服務進行通信的用戶界面,那麼您可以使用綁定到服務的活動(但創建2個不同的類:一個用於服務,一個用於具有該界面的活動) 。在Android開發人員指南中查看bound services