23、常用管理器

一、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停掉。

尝试了几种任务管理器, 都只能重置计数器(确实释放内存了),但都无法关闭定时器,只有系统自带的“强行停止”奏效。

36d0fe75-8ad9-47d3-ad56-5f0c2f9574cd

如果某个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

转载于:https://www.cnblogs.com/pengjingya/p/5509565.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值