運行電話撥號器,需要加這個許可權,否則不會打通電話。這個許可權是用戶許可權,是谷歌工程師為了跟自己撇清關係,用戶需要許可權的時候自己加。 運行android程式的時候提示:ActivityManager: Warning: Activity not started, its current task has ...
運行電話撥號器,需要加這個許可權,否則不會打通電話。這個許可權是用戶許可權,是谷歌工程師為了跟自己撇清關係,用戶需要許可權的時候自己加。
運行android程式的時候提示:ActivityManager: Warning: Activity not started, its current task has been brought to the front這是因為:
這個不是Android平臺的Bug,而是Android本身就是這樣一種處理機制。
我們在Android平臺下,通過返回按鈕,或者程式本身的退出操作,去結束一個進程的時候,實際上Android虛擬機未必會將這個進程真正的結束掉,在記憶體允許的情況下,這個程式會以緩存的形式存在Android虛擬機中。只有在記憶體不足的情況下時,Android系統會清理長時間不被激活的任務,以為其他程式提供記憶體。
Android這樣做,是為了你下一次更加快速的啟動這個程式。
所以,出現樓主這種情況,是在你的程式沒有發生任何變化,並且記憶體足夠的情況下,會將上一次執行的程式,從緩存Cached狀態直接放置到任務棧的頂端,則你的程式又可以繼續執行了。
消除警告解決辦法:
退出虛擬機的程式從新運行一遍。
電話撥號器代碼:
1 package com.example.phonedialer; 2 3 import android.net.Uri; 4 import android.os.Bundle; 5 import android.app.Activity; 6 import android.content.Intent; 7 import android.view.Menu; 8 import android.view.View; 9 import android.view.View.OnClickListener; 10 import android.widget.Button; 11 import android.widget.EditText; 12 import android.widget.Toast; 13 14 public class MainActivity extends Activity { 15 16 private EditText et_number; 17 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 //載入一個佈局 23 setContentView(R.layout.activity_main); 24 //找到我們關心的控制項;通過源碼得知EditText繼承TextView,TextView繼承自View,所以可以這樣寫。 25 et_number = (EditText) findViewById(R.id.editText1); 26 27 //找到按鈕;通過源碼得知Button繼承自TextView,TextView繼承自View,所以可以這樣寫。 28 Button btn_call = (Button) findViewById(R.id.button1); 29 /** 30 * 方法裡面接收的參數是OnClickListener類型,發現它是一個介面類型。 31 * Interface definition for a callback to be invoked when a view is clicked. 32 * 定義了一個介面類型,註冊了一個回調事件,當一個view被點擊的時候走這個回調方法。 33 */ 34 btn_call.setOnClickListener(new MyClickListener()); 35 /** 36 * 這裡的this(context也就是上下文的意思),代表MainActivity。查看源碼可以得知 37 * MainActivity繼承自Context. 38 */ 39 //Toast.makeText(this, text, duration) 40 41 } 42 /** 43 * 定義一個類,去實現按鈕需要的介面類型 44 */ 45 private class MyClickListener implements OnClickListener { 46 47 /** 48 * Called when a view has been clicked. 49 * 當按鈕已經被點擊的時候調用該方法。 50 */ 51 @Override 52 public void onClick(View v) { 53 /** 54 * 獲取EditText控制項的文本內容,第一時間想到通過et_number來獲取, 55 * 但是這個變數不是全局變數,獲取不到。所以需要將它變成全局變數。 56 * Return the text the TextView is displaying 57 * 返回TextView顯示的內容。 58 * Editable android.widget.EditText.getText() 59 */ 60 String number = et_number.getText().toString().trim(); 61 if("".equals(number)) { 62 /** 63 * context上下文 64 * The method makeText(Context, CharSequence, int) 65 * in the type Toast is not applicable for the arguments (MainActivity.MyClickListener, String, int) 66 * 這裡的this代表的是MainActivity.MyClickListener,需要的是一個Context,所以編譯報錯。 67 * 通過類名.this可以設置吐司要在哪個Activity顯示。LENGTH_SHORT 0 LENGTH_LONG 1 68 */ 69 Toast.makeText(MainActivity.this, "number不能為空", Toast.LENGTH_SHORT).show(); 70 return; 71 } 72 //拿到number進行撥打電話. 73 /** 74 * 因為撥打電話的代碼谷歌工程師已經寫好了,所以不需要我們手動寫邏輯,我們只需要 75 * 把它調起來就可以了。意圖:Intent 76 */ 77 Intent intent = new Intent(); 78 //設置動作 打電話。 79 intent.setAction(Intent.ACTION_CALL); 80 //設置打的數據 uri數據。Uri data 81 /** 82 * Url:統一資源定位符 83 * Uri:統一資源標識符 自己定義的路徑想代表什麼就代表什麼。 84 */ 85 intent.setData(Uri.parse("tel:"+number)); 86 //開啟意圖 87 startActivity(intent); 88 89 90 91 } 92 93 } 94 95 96 97 @Override 98 public boolean onCreateOptionsMenu(Menu menu) { 99 // Inflate the menu; this adds items to the action bar if it is present. 100 getMenuInflater().inflate(R.menu.main, menu); 101 return true; 102 } 103 104 }