前幾天做一個小應用,需要用到在service中調用Activity, 但是發現總是出現ANR,百度了下,發現各種說法,不過經過嘗試,發現問題不大,只需要加一句代碼就足夠了,代碼如下:
public class XXXService extends Service { public void onCreate() { super.onCreate(); //撥打到電話 Intent call = new Intent("android.intent.action.CALL", Uri.parse("tel:110")); call.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(call); } } public class XXXService extends Service { public void onCreate() { super.onCreate(); //撥打到電話 Intent call = new Intent("android.intent.action.CALL", Uri.parse("tel:110")); call.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(call); }
關鍵語句是:call.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 究其原因可能是android系統考慮到穩定性(容易出現ANR)。
可以看一下官方文檔中對於startActivity()方法的描述:
Note that if this method is being called from outside of an Activity Context, then the Intent must include the FLAG_ACTIVITY_NEW_TASK launch flag. This is because, without being started from
an existing Activity, there is no existing task in which to place the new activity and thus it needs to be placed in its own separate task.
大致的意思是這樣的:請注意,如果一個外部的Activity Context調用此方法,那麼,Intent對象必須包含 FLAG_ACTIVITY_NEW_TASK標誌,這是因為,待建立的Activity並沒有從一個已經存在的Activity啟動(任務棧中並沒有此Activity),它並沒有已經存在的任務,因此它需要被放置在自己獨立的任務中(也就是在任務棧中建立一個任務)。