2016-11-30 34 views
0

我有如下如何檢查putExtra是否存在?

Activity 1 --send data--> Service1 
          ^
          | 
Open app-------------------- 
          ^
          | 
Activity 2------------------ 

這意味着活性1將數據發送到一個服務1.服務1與在onStartCommand()返回正在運行的後臺服務是START_STICKY的圖。目前,我正在使用putExtra()函數來交換數據。的Service 1

String data=null; 
if(intent.hasExtra("data")){ 
    Bundle bundle = intent.getExtras(); 
    if(!bundle.getString("data").equals(null)){ 
     data= bundle.getString("data"); 
    } 
    } 
    else 
     data="0"; 

我用hasExtra函數來檢查data是否被設置或

Activity 1

Intent start_service = new Intent(getContext(), ConnectService.class); 
start_service.putExtra("data", "123"); 
getContext().startService(start_service); 

在onStartCommand():和在服務我將如下步驟getExtra數據不。在我的目的中,案例1是服務1可以從Activity 1接收數據。在案例2中,如果我們不從活動1開始,例如,當我清理所有正在運行的應用程序時,由於START_STICKY,電話將自動打開服務1,服務1將設置數據等於「0」。因此,我的問題來自第二種情況,應用程序崩潰,因爲它無法檢查Extra是否存在。

所致:顯示java.lang.NullPointerException:嘗試上的空對象引用

如何可以調用虛擬方法 '布爾android.content.Intent.hasExtra(java.lang.String中)'我解決了這個問題?感謝所有

+0

試試這個,http://stackoverflow.com/questions/38265993/timer-inside-android-service –

+0

謝謝但是有些情況下,服務可以從其他Activity重啓,而不是Activity 1.所以你的解決方案無法解決 – Jame

回答

4
String data=null; 
if(getIntent()!=null && getIntent().getExtras()!=null){ 
    Bundle bundle = getIntent().getExtras(); 
    if(!bundle.getString("data").equals(null)){ 
     data= bundle.getString("data"); 
    } 
} 
else 
data="0"; 

試試這個,請注意,如果條件

+0

I使用它之前,但它也得到錯誤嘗試調用虛擬方法android.os.Bundle android.content.Intent.getExtras()'在空對象引用'當我從其他活動啓動服務 – Jame

+0

它現在工作。謝謝 – Jame

1

的變化在這一步intent可能爲空。此外,您的代碼會導致數據可能爲空值。相反,你可以這樣做以下:

String data = null; 
if (intent != null) { 
    data = intent.getStringExtra("data"); 
} 
if (data == null) { 
    data = "0"; 
} 

而且你不應該使用equals()檢查null值。改爲始終使用== null

+0

謝謝,但它也得到錯誤'字符串android.content.Intent.getStringExtra(java.lang.String)'的空對象引用。假設一個簡單的例子,活動1不是MAIN和LAUNCHER活動。活動2是主要的。活動1和2都可以啓動服務,但只有活動1可以發送數據。 – Jame

+0

我不明白這是可能的。你應該用它替換你所有的發佈代碼。 'if(intent!= null)'應該防範你得到的異常。 – tynn