一、TelephonyManager
用于管理手机通话状态,获取电话信息(设备信息、sim卡信息以及网络信息),监听电话状态以及拨打电话等。
TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
1.1、拨打电话
Uri uri = Uri.parse("tel:1383838438"); Intent intent= new Intent(Intent.ACTION_DIAL,uri); startActivity(intent);
1.2、获取sim卡信息和网络信息
TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); tManager.getDeviceId(); // 设备编号 tManager.getDeviceSoftwareVersion();// 平台版本 tManager.getNetworkOperator();// 网络运营商代号 tManager.getNetworkOperatorName();// 手机网络类型 tManager.getCellLocation().toString();// 设备所在位置 tManager.getSimCountryIso(); // sim卡的国别 tManager.getSimSerialNumber();// sim卡序列号 tManager.getSimState();// sim卡状态
注意添加权限
<!-- 添加访问手机位置的权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 添加访问手机状态的权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
除以上外,PhonyManager还拥有许多字段和属性,这里便不再叙述,需要时查看文档即可。
1.3、两种拨号方式
a) 直接拨号
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:112"));
b) 拨号界面
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:112"));
二、SmsManager
用于管理短信操作,如发送数据,文本和PDU短信。
SmsManager manager = SmsManager.getDefault();
.1、常用方法
ArrayList<String> divideMessage(String text)
当短信超过SMS消息的最大长度时,将短信分割为几块。
参数:text——初始的消息,不能为空
返回值:有序的ArrayList<String>,可以重新组合为初始的消息
•static SmsManager getDefault()
获取SmsManager的默认实例。
返回值:SmsManager的默认实例
•void SendDataMessage(String destinationAddress, String scAddress, short destinationPort, byte[] data,
PendingIntent sentIntent, PendingIntent deliveryIntent)
发送一个基于SMS的数据到指定的应用程序端口。
参数:
1)、destinationAddress——消息的目标地址
2)、scAddress——服务中心的地址or为空使用当前默认的SMSC 3)destinationPort——消息的目标端口号
4)、data——消息的主体,即消息要发送的数据
5)、sentIntent——如果不为空,当消息成功发送或失败这个PendingIntent就广播。
结果代码是Activity.RESULT_OK表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU之一表示错误。
对应RESULT_ERROR_GENERIC_FAILURE,sentIntent可能包括额外的“错误代码”包含一个无线电广播技术特定的值,通常只在修复故障时有用。
每一个基于SMS的应用程序控制检测sentIntent。如果sentIntent是空,调用者将检测所有未知的应用程序,这将导致在检测的时候发送较小数量的SMS。
6)、deliveryIntent——如果不为空,当消息成功传送到接收者这个PendingIntent就广播。
异常:如果destinationAddress或data是空时,抛出IllegalArgumentException异常。
•void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts,
ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliverIntents)
发送一个基于SMS的多部分文本,调用者应用已经通过调用divideMessage(String text)将消息分割成正确的大小。
参数:
1)、destinationAddress——消息的目标地址
2)、scAddress——服务中心的地址or为空使用当前默认的SMSC
3)、parts——有序的ArrayList<String>,可以重新组合为初始的消息
4)、sentIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent
5)、deliverIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent
异常:如果destinationAddress或data是空时,抛出IllegalArgumentException异常。
•void sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent,
PendingIntent deliveryIntent)
发送一个基于SMS的文本。参数的意义和异常前面的已存在的一样,不再累述
1.2、短信实例
String phone = mEtPhone.getText().toString(); String content = mEtContent.getText().toString(); SmsManager manager = SmsManager.getDefault(); ArrayList<String> list = manager.divideMessage(content); //因为一条短信有字数限制,因此要将长短信拆分 for(String text:list){ manager.sendTextMessage(phone, null, text, null, null); } Toast.makeText(getApplicationContext(), "发送完毕", Toast.LENGTH_SHORT).show();
三、InputMethodManager
inputMethodManager主要是用于控制显示或隐藏输入法面板的类。
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
1.1、输入法管理
a)显示输入法
InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); EditText eText = (EditText) findViewById(R.id.edit_query); eText.requestFocus(); manager.showSoftInput(eText, 0);
b)隐藏输入法
InputMethodManager manager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); EditText eText = (EditText) findViewById(R.id.edit_query); eText.requestFocus(); manager.hideSoftInputFromWindow(eText.getWindowToken(), 0);
c)空白区域隐藏输入法
/** * 点击空白区域 自动隐藏软键盘 */ public boolean onTouchEvent(MotionEvent event) { if(null != this.getCurrentFocus()){ /**点击空白位置 隐藏软键盘*/ InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); } return super .onTouchEvent(event); }
四、PackageManager
PackageManager主要用于安装和卸载、以及查询权限、清除用户数据、获取版本信息等操作。
PackageManager manager = getPackageManager();
1.1、获取版本信息
try { PackageManager manager = getPackageManager(); PackageInfo info = manager.getPackageInfo(getPackageName(), 0); String versionName = info.versionName; int versionCode = info.versionCode; } catch (NameNotFoundException e) { e.printStackTrace(); }
1.2、获取安装应用信息
/** * PackageManager介绍: * 本类API是对所有基于加载信息的数据结构的封装,包括以下功能: * 安装,卸载应用 查询permission相关信息 查询Application相关 * 信息(application,activity,receiver,service,provider及相应属性等) * 查询已安装应用 增加,删除permission 清除用户数据、缓存,代码段等 非查询相关的API需要特定的权限。 * 主要包含了,安装在当前设备上的应用包的相关信息 * 如下:获取已经安装的应用程序的信息 */ private HashMap<String, String> installPackagesInfo(){ // 获取packageManager对象 PackageManager packageManager = this.getPackageManager(); /* getInstalledApplications 返回当前设备上安装的应用包集合 * ApplicationInfo对应着androidManifest.xml中的application标签。 * 通过它可以获取该application对应的信息 */ List<ApplicationInfo> applicationInfos = packageManager.getInstalledApplications(0); HashMap<String, String> resultMap = new HashMap<String, String>(); Iterator<ApplicationInfo> iterator = applicationInfos.iterator(); while(iterator.hasNext()){ ApplicationInfo applicationInfo = iterator.next(); String packageName = applicationInfo.packageName;// 包名 String packageLabel = packageManager.getApplicationLabel(applicationInfo).toString();//获取label resultMap.put(packageLabel, packageName); } return resultMap; }
五、AlarmManager
1.1、主要方法
// 取消已经注册的与参数匹配的定时器 void cancel(PendingIntent operation) // 注册一个新的延迟定时器 void set(int type, long triggerAtTime, PendingIntent operation) // 注册一个重复类型的定时器 void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) // 注册一个非精密的重复类型定时器 void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation) // 设置时区 void setTimeZone(String timeZone)
1.2、定时器主要类型
public static final int ELAPSED_REALTIME // 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的, 包括睡眠时 间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3 (0x00000003)。 public static final int ELAPSED_REALTIME_WAKEUP //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。 public static final int RTC //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间, 可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。 public static final int RTC_WAKEUP //能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。 public static final int POWER_OFF_WAKEUP //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。
当你的应用不在运行,而此时你仍然需要你的应用去执行一些操作(比如,短信拦截),只有这种时候才使用AlarmManager, 其他正常情况下的,推荐使用Handler
1.3、生命周期
repeating AlarmManager一旦启动就会一直在后台运行(除非执行cancel方法),可以在“应用管理”中看到这个应用状态是正在运行。 “强行停止”可以让Alarmmanager停掉。
尝试了几种任务管理器, 都只能重置计数器(确实释放内存了),但都无法关闭定时器,只有系统自带的“强行停止”奏效。
如果某个AlarmManager已经启动, 程序又再次去启动它,只要PendingIntent是一样,那么之前那个AlarmManager会被release掉。
1.4、使用AlarmManager
使用AlarmManager共有三种方式, 都是通过PendingIntent。
getActivity(Context, int, Intent, int) getBroadcast(Context, int, Intent, int) getService(Context, int, Intent, int)
实例等待总结。。。
六、WindowManager(理解后再整理)
1.1、获取WindowManager
WindowManager是Android中一个重要的Service,是全局且唯一的。WindowManager继承自ViewManager。
WindowManager主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。
WindowManager wmManager =(WindowManager) getSystemService(Context.WINDOW_SERVICE);
在Activity和Service中都可以直接使用这个方法来获得WindowManager。其getSystemService返回的是一个WindowManagerImpl对象,
这是一个存在于本地进程中的一个对象。而事实是 WindowManagerImpl 继承了WindowManager,而WindowManger继承了ViewManager。
1.2、WindowManager.LayoutParams
LayoutParams里面存放着的是窗口的属性,通过这个变量,可以为窗口赋予各式的属性。也可以改变它的属性值,
来进行各种各样的操作,像悬浮窗口的拖动,拉伸等操作。
详细的属性列表:
http://www.cnblogs.com/shitianzeng/articles/2814050.html
1.3、WindowManager的操作
WindowManager继承自ViewManager,实现操作子View的三个方法:添加、更新、移除。
/** Interface to let you add and remove child views to an Activity. To get an instance*/ public interface ViewManager { public void addView(View view, ViewGroup.LayoutParams params); public void updateViewLayout(View view, ViewGroup.LayoutParams params); public void removeView(View view); }
1.4、挂载View
public void showLoaction(String address) { WindowManager.LayoutParams params = new LayoutParams(); params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; params.format = PixelFormat.TRANSLUCENT; params.type = WindowManager.LayoutParams.TYPE_TOAST; params.setTitle("Toast"); TextView view = new TextView(this); view.setText(address); WindowManager windowManager = (WindowManager) this.getSystemService(WINDOW_SERVICE); windowManager.addView(view, params); }
1.5、悬浮窗示例
Button bb=new Button(getApplicationContext()); WindowManager wm=(WindowManager)getApplicationContext().getSystemService("window"); WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams(); wmParams.type=2002; //type是关键,这里的2002表示系统级窗口,你也可以试试2003。 wmParams.format=1; /** *这里的flags也很关键 *代码实际是wmParams.flags |= FLAG_NOT_FOCUSABLE; *40的由来是wmParams的默认属性(32)+ FLAG_NOT_FOCUSABLE(8) */ wmParams.flags=40; wmParams.width=40; wmParams.height=40; wm.addView(bb, wmParams);
1.5、Window自定义标题
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
其中requestWindowFeature方法中传入一些枚举常量:
- DEFAULT_FEATURES:系统默认状态,一般不需要指定
- FEATURE_CONTEXT_MENU:启用ContextMenu,默认该项已启用,一般无需指定
- FEATURE_CUSTOM_TITLE:自定义标题。当需要自定义标题时必须指定。
- FEATURE_INDETERMINATE_PROGRESS:不确定的进度
- FEATURE_LEFT_ICON:标题栏左侧的图标
- FEATURE_NO_TITLE:没有标题
- FEATURE_OPTIONS_PANEL:启用“选项面板”功能,默认已启用。
- FEATURE_PROGRESS:进度指示器功能
- FEATURE_RIGHT_ICON:标题栏右侧的图标
并且该方法必须放在setContentView()之前。(具体待整理)
http://www.th7.cn/Program/Android/201404/187671.shtml