2013-02-02 82 views
7

我知道這個問題已被問了很多次,但所有其他線程根本沒有解決我的問題,我看不出我的代碼有什麼問題。也許我在這裏錯過了一些東西,有人能幫我嗎?Android IntentService不啓動

代碼的意圖服務:

package Services; 

import android.app.IntentService; 
import android.content.Intent; 
import android.widget.Toast; 

public class WifiSearchService extends IntentService { 

    /** 
    * A constructor is required, and must call the super IntentService(String) 
    * constructor with a name for the worker thread. 
    */ 
    public WifiSearchService() { 
     super("WifiSearchService"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); 
     return super.onStartCommand(intent,flags,startId); 
    } 

    /** 
    * The IntentService calls this method from the default worker thread with 
    * the intent that started the service. When this method returns, IntentService 
    * stops the service, as appropriate. 
    */ 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     // Normally we would do some work here, like download a file. 
    // For our sample, we just sleep for 5 seconds. 
     long endTime = System.currentTimeMillis() + 5*1000; 
     while (System.currentTimeMillis() < endTime) { 
      synchronized (this) { 
       try { 
        wait(endTime - System.currentTimeMillis()); 
       } catch (Exception e) { 
       } 
      } 
     } 
    } 

} 

輕彈開關啓動服務:

package com.cdobiz.wifimapper; 

import Services.WifiSearchService; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.ActivityManager; 
import android.app.ActivityManager.RunningServiceInfo; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.Switch; 

public class MainActivity extends Activity { 

    private Context context; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     context = this; 

     setContentView(R.layout.activity_main); 


     Switch serviceSwitch = (Switch) this.findViewById(R.id.switchService); 

     serviceSwitch.setChecked(isMyServiceRunning()); 

     serviceSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 

      @Override 
      public void onCheckedChanged(CompoundButton view, boolean state) { 

       if(state){ 
        startService(new Intent(context, WifiSearchService.class)); 
       }else{ 
        stopService(new Intent(context, WifiSearchService.class)); 
       } 
      } 

     }); 

    } 

    private boolean isMyServiceRunning() { 
     ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
     for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
      Log.v("debug", service.service.getClassName()); 
      if ("com.cdobiz.wifimapper.services.WifiSearchService".equals(service.service.getClassName())) { 
       return true; 
      } 
     } 
     return false; 
    } 


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

} 

清單:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.cdobiz.wifimapper" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="14" 
     android:targetSdkVersion="17" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 

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

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:enabled="true" android:name=".services.WifiSearchService"></service> 
    </application> 

</manifest> 
+3

.services包中的WifiSearchService?如果不是,你應該刪除.services。如果它找不到服務,它不會啓動它,並且它沒有表明它找不到它,這是令人討厭的。 – Mgamerz

+1

是的,它位於一個名爲Services的包中。 – thedjaney

+1

我在那裏扔了一堆日誌語句,看它是否真的到達啓動它的代碼。不知道你是否已經嘗試過,因爲你的代碼沒有顯示它。你也把這個包聲明爲Services,但是這個manifest顯示爲.services - 是否應該大寫? – Mgamerz

回答

16

我能夠通過改變運行服務將軟件包名稱改爲com.cdobiz.wifimapper.services 並更改軟件包名稱清單中的服務。

+4

結論:軟件包應該以小寫字母開頭..謝謝! – thedjaney

+0

@thedjaney你應該給這個答案..謝謝 – Nabin

1

我解決了我的意圖服務還未啓動問題通過使用

Intent intent = new Intent(this,UploadService.class); 
    this.startService(intent); 

開始我的服務

4

我有同樣的問題。我通過複製類內容代碼文本來解決它。然後我通過右鍵單擊包 - >新建 - >服務 - >服務(Intent) ,然後我將相同的代碼粘貼到類中並且它可以工作,從而刪除了該類並重新創建了相同的類。

我希望這將是有益的人

6

我通過確保在service在App-清單註冊解決了這個問題。

0

我有同樣的問題。 解決它我刪除了Intenservice類,無線 我創建了一個新的類,使用:右鍵單擊>新建>服務>服務(IntentService)