运行电话拨号器,需要加这个权限,否则不会打通电话。这个权限是用户权限,是谷歌工程师为了跟自己撇清关系,用户需要权限的时候自己加。
运行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 }