2013-01-04 21 views
0

我想要一個沒有活頁夾的簡單服務。只需在啓動時啓動服務,不會破壞服務。 我已經與位置經理建立了服務。但該服務無法啓動。什麼是錯誤的?android:位置管理器的簡單服務

public class WayService extends Service implements LocationListener { 

blabla 
... 

    public WayService(Context context) { 
     this.mContext = context; 
     getLocation(); 
    } 

    public Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext 
        .getSystemService(LOCATION_SERVICE); 

      // getting GPS status 
      isGPSEnabled = locationManager 
        .isProviderEnabled(LocationManager.GPS_PROVIDER); 

      // getting network status 
      isNetworkEnabled = locationManager 
        .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if (!isGPSEnabled && !isNetworkEnabled) { 
       // no network provider is enabled 
      } else { 
       this.canGetLocation = true; 
       // First get location from Network Provider 
       if (isNetworkEnabled) { //! hinzugefuegt 
        locationManager.requestLocationUpdates(
          LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("Network", "Network"); 
        if (locationManager != null) { 
         location = locationManager 
           .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
       // if GPS Enabled get lat/long using GPS Services 
       if (isGPSEnabled) { 
        if (location == null) { 
         locationManager.requestLocationUpdates(
           LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
         Log.d("GPS Enabled", "GPS Enabled"); 
         if (locationManager != null) { 
          location = locationManager 
            .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
          if (location != null) { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
           time = location.getTime(); 
           speed = location.getSpeed(); 
          } 
         } 
        } 
       } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return location; 
    } 

blabla 
... 

@Override 
    public void onLocationChanged(Location location) { 
     double latitude = getLatitude(); 
     double longitude = getLongitude(); 
     String mlat = String.valueOf(latitude); 
     String mlon = String.valueOf(longitude); 
     new PostData().execute(mlat, mlon, mtime); 
    } 

的清單如下:

<application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service 
      android:name=".WayService" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name" > 
     </service> 


     <receiver android:name="WayStartServiceReceiver" > 
     </receiver> 

    </application> 

和:

public class WayStartServiceReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
     Intent service = new Intent(context, WayService.class); 
     context.startService(service); 
     } 
    } 

這裏是我的日誌文件:

01-09 13:35:29.317: D/dalvikvm(452): newInstance failed: no <init>() 
01-09 13:35:29.337: D/AndroidRuntime(452): Shutting down VM 
01-09 13:35:29.337: W/dalvikvm(452): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
01-09 13:35:29.367: E/AndroidRuntime(452): FATAL EXCEPTION: main 
01-09 13:35:29.367: E/AndroidRuntime(452): java.lang.RuntimeException: Unable to instantiate service de.app.trackmyway.WayService: java.lang.InstantiationException: de.app.trackmyway.WayService 
01-09 13:35:29.367: E/AndroidRuntime(452): at android.app.ActivityThread.handleCreateService(ActivityThread.java:1929) 
01-09 13:35:29.367: E/AndroidRuntime(452): at android.app.ActivityThread.access$2500(ActivityThread.java:117) 
01-09 13:35:29.367: E/AndroidRuntime(452): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985) 
01-09 13:35:29.367: E/AndroidRuntime(452): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-09 13:35:29.367: E/AndroidRuntime(452): at android.os.Looper.loop(Looper.java:123) 
01-09 13:35:29.367: E/AndroidRuntime(452): at android.app.ActivityThread.main(ActivityThread.java:3683) 
01-09 13:35:29.367: E/AndroidRuntime(452): at java.lang.reflect.Method.invokeNative(Native Method) 
01-09 13:35:29.367: E/AndroidRuntime(452): at java.lang.reflect.Method.invoke(Method.java:507) 
01-09 13:35:29.367: E/AndroidRuntime(452): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
01-09 13:35:29.367: E/AndroidRuntime(452): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
01-09 13:35:29.367: E/AndroidRuntime(452): at dalvik.system.NativeStart.main(Native Method) 
01-09 13:35:29.367: E/AndroidRuntime(452): Caused by: java.lang.InstantiationException: de.app.trackmyway.WayService 
01-09 13:35:29.367: E/AndroidRuntime(452): at java.lang.Class.newInstanceImpl(Native Method) 
01-09 13:35:29.367: E/AndroidRuntime(452): at java.lang.Class.newInstance(Class.java:1409) 
01-09 13:35:29.367: E/AndroidRuntime(452): at android.app.ActivityThread.handleCreateService(ActivityThread.java:1926) 
01-09 13:35:29.367: E/AndroidRuntime(452): ... 10 more 
+0

你是否通過在getLocation()方法中傳遞上下文作爲參數來嘗試它?就像getLocation(context); – itsrajesh4uguys

+0

當我在一個活動中啓動這樣的服務時: gps = new WayService(this); 然後它的工作... – sarahsdev

+0

這將像普通的構造函數不作爲服務工作.. – itsrajesh4uguys

回答

0

我希望我們能不能創造的Android服務的構造。就像我們不能在我們的Activity中創建構造函數一樣。我們將使用我們的默認覆蓋方法如下。

@Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

別的嘗試使用服務類的OnCreate。在創建調用方法getLocation();如果您嘗試使用oncreate意味着它會起作用。你不會得到任何問題。

+0

這樣的最後一行: @Override public void onCreate(){ \t getLocation(); } – sarahsdev

+0

是的...因爲你也可以傳遞上下文..在分配上下文值 – itsrajesh4uguys

+0

好吧,我嘗試像這樣: public void onCreate(Context context){ this.mContext = context; getLocation(); }這可以在虛擬設備管理器 – sarahsdev

0

您需要註冊意圖過濾器,它更就像告訴接收器它需要l一樣isten to broadcast

<receiver android:name="WayStartServiceReceiver" > 

      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
</receiver> 

另外應用程序應該安裝在內部存儲器上。

編輯:

https://groups.google.com/forum/?fromgroups=#!topic/android-beginners/B_lTmXcfo6A

而不是使用構造函數,你應該做一些這樣的事

@Override 
public void onCreate() { 
    // Task to be done on first service start 
    super.onCreate(); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    // Task to be done on each intent received. 
    super.onStart(intent, startId); 
} 
+0

好吧,我試試看。當我用eclipse測試ist時,它沒有給出任何錯誤,但是當我在我的移動設備上測試它時,它墜毀了 – sarahsdev

+0

發送日誌給我們調試 –

+0

日誌同樣有助於確定設備上出現了什麼問題。可能是由於Android版本或一些服務爪子。 –