Telephone dialer
程序员文章站
2023-11-23 17:32:40
运行电话拨号器,需要加这个权限,否则不会打通电话。这个权限是用户权限,是谷歌工程师为了跟自己撇清关系,用户需要权限的时候自己加。 运行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 }