Android开发——系统服务和Manager

TelephonyManager

描述:访问电话服务的一些信息,可以监听电话的状态。不能实例化这个类,通过系统的服务实例化这个对象——getSystemService(TELEPHONY_SERVICE)

1.TelephonyManager类

Constants
int CALL_STATE_IDLE 电话的空闲状态,没有任何来电时,可以用来做挂断电话的状态
int CALL_STATE_OFFHOOK 电话接通状态
int CALL_STATE_RINGING 电话响铃状态
Public Methods
String getSimSerialNumber()
获取sim卡的序列号。 关于获取sim卡信心的方法都定义在这个类里面,需要时可以来看一下
int getCallState()
获取电话的状态
void listen( PhoneStateListener listener, int events)
对来电注册一个监听器,监听来电的事件,event:是电话监听器监听的具体哪个事件

2.PhoneStateListener类

注:录音时需要创建MediaRecorder对象,录音的所有逻辑实现都在这个对象的帮助描述中,使用时复制即可
Constants
int LISTEN_CALL_STATE 电话的接听状态,对应Telephony中的listen方法中的event事件值
Public Methods
void onCallStateChanged(int state,  String incomingNumber)
当电话状态改变时调用


WindowManager

1.WindowMannger接口

获取:窗口管理器,通过系统服务实例化该对象———getSystemService(WINDOW_SERVICE)

窗口:手机整个屏幕就是一个窗口,我们可以在窗口中展示各种各样的界面,Activity是依附于窗口而存在的。

知识点:此类是ViewManager接口的实现类,各种布局各种父控件都实现了这个接口。通过这个接口才具备了addView(view,params)方法,只要实现了这个接口,这个类必然有一个LayoutParams内部类

Public Methods
abstract  Display getDefaultDisplay()
获取默认的显示对象
abstract void addView( View view,  ViewGroup.LayoutParams params)
添加一个子view到窗口布局中,窗口在最上层,参数2:表示控件的布局位置
abstract void removeView( View view)
    删除其中添加的view
abstract void updateViewLayout( View view,  ViewGroup.LayoutParams params)
    更新窗口控件的布局,并且更新后不会超出窗口范围。参数2:已经更新的布局参数

2.Display终类

Public Methods
int getHeight()
获取屏幕高,已过时
int getWidth()
获取屏幕宽,已过时
void getSize( Point outSize)
获取屏幕尺寸,并且把屏幕尺寸封装到Point对象中,以后通过Point对象的成员变量x和y


PackageManager

1.PackageManager类

说明:一般通过Context对象的getPackageManager()方法获取该对象

Public Methods
abstract  PackageInfo getPackageInfo( String packageName, int flags)
获取包信息对象, packageName;工程包名;flags:一般为0
abstract  List< ApplicationInfo> getInstalledApplications(int flags)
获取已经安装的所有App信息对象
abstract  List< PackageInfo> getInstalledPackages(int flags)
获取已经安装的所有程序的包对象,参数1:一般传入0即可
abstract  Intent getLaunchIntentForPackage( String packageName)
获取指定包名启动的intent对象

2.PackageInfo抽象类

Fields
public int versionCode 获取版本号,版本序号
public  String versionName 获取版本名,版本全名
public  ApplicationInfo applicationInfo 获取包对应的应用信息对象
public  String packageName 获取包名

3.ApplicationInfo类

Constants
int FLAG_SYSTEM 标识系统应用的特殊标记
int FLAG_EXTERNAL_STORAGE 安装在外部存储卡应用的特殊标记
public int flags 每一个应用的标记,这里的标记表示一个状态机,与特定的标识相与还是这个特定的标识,就说明此应用具有这个特定标识所表示的特性
Public Methods
Drawable loadIcon( PackageManager pm)
获取应用的图标对象
CharSequence loadLabel( PackageManager pm)
获取应用的标签对象
Drawable loadLogo( PackageManager pm)
获取应用的Logo

SmsManager

1.SmsManager终类

注:短信管理器,通过getDefault()方法对该对象进行初始化

Public Methods
ArrayList< String> divideMessage( String text)
短信内容超出一条短信的可支持最大内容时,可用该方法对文本进行拆分,然后再发送
static  SmsManager getDefault()
初始化该对象
void sendTextMessage( String destinationAddress,  String scAddress,  String text,  PendingIntent sentIntent,  PendingIntent deliveryIntent)
发送一个文本短信;参数1:发送的地址电话号码;参数2:短信服务中心的地址,null表示默认服务中心;参数3:短信内容;参数4:发送成功后做什么;参数5:接受成功后干什么

2.SmsMessage类

注意:这个类和SmsManager没关系,不要弄混,主要是用来解析短信的

Public Methods
static  SmsMessage createFromPdu(byte[] pdu)
通过字节数组初始化该解析对象,这个字节数组数据一般是存储在Intent中Bundle对象中key值为【pdus】的Object[]数组中的一个值
String getOriginatingAddress()
获取发送短信方的电话
String getMessageBody()
获取短信中的文本内容


LocationManager

注意:如果你想开发获取位置的应用,你不要用Google这套API,偏移不说,受太多局限。最好使用第三方的,如百度地图开放平台,查询位置的方式==>1.GPS==>wifi==>3G,定位非常准,误差可能在几米之内。所以做地图或者获取位置可以使用百度或者高德地图的SDK

1.定位相关知识

(1)网络定位:IP地址和实际地址对应起来,形成一个数据库,通过IP值查询其相应的地址。缺陷:IP地址动态分配,导致定位不准确

(2)基站定位:三个基站通过一些无线电波等相关东西确定你当前所在的位置,一个基站只能确定你所在的圆形范围。缺陷:定位精度不高,在几百米到几公里不等 

(3)GPS定位:美国全球卫星定位系统,至少需要3颗卫星来定位,实际上有24颗卫星,覆盖了全球90%区域,不需要联网。好处:精度比较高,几米到几十米不等。缺点:容易受云层、建筑、大树等影响,会挡住卫星的信号

(4)A-GPS定位:服务GPS定位系统,通过网络和GPS联合定位。Andoird手机采取的定位方式

2.LocationManager类

注:通过系统服务对该对象进行初始化。getSystemService(LOCATION_SERVICE)

Constants
String GPS_PROVIDER GSP定位提供者
String NETWORK_PROVIDER 网络定位提供者
String PASSIVE_PROVIDER 被动定位提供者

Public Methods
List< String> getAllProviders()
获取手机全部位置提供者。network:网络定位提供者;gps:GPS定位提供者;passive:被动的定位,获取其他应用已定位完成的数据
String getBestProvider( Criteria criteria, boolean enabledOnly)
获取一个当时最好的位置提供者,参数1:传入一个挑选的标准;参数2:true——只返回能用的
void requestLocationUpdates( String provider, long minTime, float minDistance,  LocationListener listener)
请求位置定位,参数1:定位方式提供者;参数2:最短更新时间;参数3:最短定位距离;参数4:位置监听器

3.LocationListener接口

Public Methods
abstract void onLocationChanged( Location location)
位置已发生变化就调用
abstract void onProviderDisabled( String provider)
用户关闭GSP开关
abstract void onProviderEnabled( String provider)
用户打开GPS开关
abstract void onStatusChanged( String provider, int status,  Bundle extras)
位置提供者状态发生变化时调用,位置提供者由能用变成不能用时调用。一般GSP都可以,当你进入电梯时GPS定位不能用了

4.Location类

Public Methods
double getLatitude()
获取维度
double getLongitude()
获取经度
float getAccuracy()
获取精确度,一般是50M以内
double getAltitude()
获取海拔

5.火星坐标相关

解释:对真实坐标进行算法的加偏处理,没人能看懂。中国国内的地图和GPS系统都进行了火星加偏处理,成为了火星地图,只有国内能用

工具:火星坐标转换工具,找出算法的规律,使用数据库能够对火星坐标与原始坐标间的相互转换。通过关键的建筑物,让后通过算法结合火星所标算出你的真实坐标

DevicePolicyManager

1.使用该类的步骤

(1)首先建立一个DeviceAdminReceiver的子类广播接收者类,不用定义内容

(2)注册广播接受者

<receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver"------------需要替换为我们自己的广播接受者对象
        android:label="@string/sample_device_admin"-----------系统管理员的名字
        android:description="@string/sample_device_admin_description"------------系统管理员的文字描述
        android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
            android:resource="@xml/device_admin_sample" />-------------需要在res目录下建立一个xml目录,在此目录下创建这里指定的xml文件即可
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>

(3)创建res/xml目录,创建给予广播接收者权限

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-policies>-----------表示我这个系统管理员定以后能获得哪些权限
    <limit-password />------------限制密码
    <watch-login />-----------检测登陆
    <reset-password />------------重置密码
    <force-lock />-----------强制锁屏
    <wipe-data />-----------清除数据
    <expire-password />
    <encrypted-storage />
    <disable-camera />
  </uses-policies>
</device-admin>

2.DevicePolicyManager类

注:策略管理器,通过系统服务实例化该对象——getSystemService(DEVICE_POLICY_SERVICE)

特殊:

<1>.调用该对象的方法大多需要管理员权限,开启管理员权限的步骤:(前提需要配置上边的广播接收者)【手机设置】==>【安全】==>【设备管理器】,这时你即可看见我们配置的系统管理员的广播接受者,勾选其即可

<2>.我们如果要使用该对象的方法,必须帮助用户来激活管理员权限,所以我们需要使用隐式意图跳转到该应用的激活管理员权限界面

//初始化管理员部件
ComponentName mDeviceAdminSample = new ComponentName(this,我们自定义的系统管理员广播接受者字节码文件对象)
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);//该界面的Action值
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
		mActivity.getString(R.string.add_admin_extra_app_text));
startActivityForResult(intent);

Public Methods
void lockNow()
系统立即锁屏
boolean isAdminActive( ComponentName who)
本应用的系统管理员权限是否激活
void removeActiveAdmin( ComponentName who)
移除该应用的系统管理员权限
boolean resetPassword( String password, int flags)
屏幕锁屏后重置密码,对系统设置一个新密码,不管过去有无密码。清除密码可以使用这个方法传入一个空字符串。参数1:设置的密码;参数2:默认可以为0,其他值表示其他管理员权限可否修改密码。
void wipeData(int flags)
清除数据,参数1:0指的是内部存储器,DevicePolicyManager.WIPE_EXTERNAL_STORAGE指的是连同SD卡数据也同样清空

ActivityManager

1.ActivityManager类

特:杀死自己线程的方法

<1>.System.exit(int code);参数:传入0或者1

<2>.android.os.Process.killProcess(android.os.Process.myPid());杀死自己所在线程

注:通过系统的服务实例化该对象-----------getSystemService(ACTIVITY_SERVICE)

Public Methods
List< ActivityManager.RunningServiceInfo> getRunningServices(int maxNum)
获取系统当前运行的所有服务,参数1:获取的服务最大数
List< ActivityManager.RunningAppProcessInfo> getRunningAppProcesses()
获取当前运行的所有App进程
void getMemoryInfo( ActivityManager.MemoryInfo outInfo)
该方法不是获取值,而是给参数MemoryInfo对象赋值,这个内存信息对象存储的是系统的总内存信息
MemoryInfo[] getProcessMemoryInfo(int[] pids)
获取指定线程的内存信息对象,返回的对象类型是Debug.MemoryInfo。参数1:特定线程的pids
void killBackgroundProcesses( String packageName)
杀死后台执行的指定线程。杀死其它某一个线程
List< ActivityManager.RunningTaskInfo> getRunningTasks(int maxNum)
获取正在运行的所有应用的任务栈,参数1:获取多少个任务,从任务栈最上边开始计算

2.ActivityManager.RunningServiceInfo静态类

Fields
public int pid 获取服务对应的pid
public  String process 获取服务所在进程名
public  ComponentName service 封装了一个服务对象,该对象中包含此服务所有属性信息,包括服务对应的服务class文件名
public int uid 获取服务对应的uid

3.ComponentName终类

Public Constructors
ComponentName( Context pkg,  Class<?> cls)
通过上下文包和字节码类初始化
Public Methods
String getClassName()
获取字节码文件的类名
String getPackageName()
获取包名

4.Debug.MemoryInfo静态类

Public Methods
nt getTotalPrivateDirty()
获取应用独占的内存大小
int getTotalSharedDirty()
获取应用占得Linux共享的内存空间大小

5.ActivityManager.MemoryInfo静态类

注:进入系统根目录【proc】(此目录中都是系统各种配置文件)==>【meminfo】这个文件有各种系统的存储信息,内存信息以改变,系统就会自动更新该文件

Fields
public long availMem 系统可用内存
public long totalMem 系统总内存,这是API 16的方法,低版本不能使用该方法

6.ActivityManager.RunningAppProcessInfo静态类

Fields
public  String processName 获取线程的包名
public int pid 获取进程id,pid==>process id

AppWidgetManager

注:窗口小部件widget管理者,实例化该对象通过——————AppWidgetManager.getInstance(context);

1.创建Widget步骤

(1)自定义一个广播接受者,继承AppWidgetProvider

(2)注册这个widget提供者,注册代码如下

<receiver android:name="自定义widget提供者全类名" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/example_appwidget_info" />--------我们自定义的widget提供者的配置文件
</receiver>

(3)创建一个Xml的配置文件,在【res】目录下创建【xml】目录,自定义【example_appwidget_info.xml】

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"---------最小宽度
    android:minHeight="40dp"----------最小高度
    android:updatePeriodMillis="86400000"-----------更新时间间隔,单位毫秒,最短更新时间间隔是30分钟
    android:previewImage="@drawable/preview"-----------预览图片,就是我们查看窗口小部件时显示的图片。默认设应用图标
    android:initialLayout="@layout/example_appwidget"------------初始化的布局文件
    android:configure="com.example.android.ExampleAppWidgetConfigure" -------------配置页面,因为某些widget拖到桌面时需要配置选择一些东西,根据用户选择的结果初始化widget的数据
    android:resizeMode="horizontal|vertical"------------可变的大小,水平和垂直方向的拉伸
    android:widgetCategory="home_screen|keyguard"------------widget的类型:展现在主页和锁屏页面(4.2+支持,两个都能显示)
    android:initialKeyguardLayout="@layout/example_keyguard"------------锁屏页面要展现的布局文件(4.2+支持)
	>
</appwidget-provider>

(4)创建相关需要的布局文件,类如initialLayout、configure或者initialKeyguardLayout的

2.AppWidgetProvider类

Public Methods
void onEnabled( Context context)
当widget第一次添加到桌面时被调用,一个桌面可以添加多个Widget
void onUpdate( Context context,  AppWidgetManager appWidgetManager, int[] appWidgetIds)
新增widget时,或者更新时被调用(就是每次经过配置文件设置的最小更新间隔时间时)
void onDeleted( Context context, int[] appWidgetIds)
widget被删除时被调用
void onDisabled( Context context)
最后一个widget从桌面移除时被调用
void onAppWidgetOptionsChanged( Context context,  AppWidgetManager appWidgetManager, int appWidgetId,  Bundle newOptions)
widget设置参数发生变化,比如大小调整之后调用,一个widget被创建,从无到有就会调用这个方法
void onReceive( Context context,  Intent intent)
每次在上边5个方法被调用之后绝对会调用onReceive()方法

3.AppWidgetManager类

Public Methods
void updateAppWidget( ComponentName provider,  RemoteViews views)
通过两个参数更新widget

上边方法使用事例代码:

//参数1:上下文包;参数2:表示我们自定义的widget的AppWidgetProvider字节码文件对象
ComponentName provider = new ComponentName(this, MyWidget.class);

//初始化远程view对象。参数1:自己应用的包名;参数2:widget布局的id
RemoteViews views = new RemoteViews(this.getPackageName(), R.layout.widget_process);

// 通知桌面更新widget
AppWidgetManager mAWM = AppWidgetManager.getInstance(this);
mAWM.updateAppWidget(provider, views);//把views改变后数据传递给Launcher2中的widget
//所以我们想要改变Widget,只要改变这个RemoteView对象即可

4.RemoteViews类

Public Methods
void setTextViewText(int viewId,  CharSequence text)
修改一个TextView控件文字为指定文字。参数1:TextView控件id;参数2:文本数据
void setOnClickPendingIntent(int viewId,  PendingIntent pendingIntent)
设置点击view后跳转的界面。参数1:点击的view控件。参数2:跳转界面的延迟意图对象

5.PendingIntent终类

解释:延时意图我们不知道什么时候该意图会被触发,不过我们可以定义触发该意图后执行的逻辑

Public Methods
static  PendingIntent getActivity( Context context, int requestCode,  Intent intent, int flags)
创建一个延迟开启界面的意图。参数1:上下文;参数2:请求码;参数3:开启的意图对象;参数4:Widget中通常使用PendingIntent.FLAG_UPDATE_CURRENT
static  PendingIntent getBroadcast( Context context, int requestCode,  Intent intent, int flags)
创建一个延迟发送广播的意图。参数值与延迟Activity类似
static  PendingIntent getService( Context context, int requestCode,  Intent intent, int flags)
创建一个延迟开启服务的意图。参数值与延迟Activity类似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值