Android获取服务getSystemService详解

getSystemService(String name)是Android很重要的一个API,它是Activity的一个方法,根据NAME来取得对应的Object,然后转换成相应的服务对象。以下介绍系统相应的服务。

name

返回的对象

说明

WINDOW_SERVICE

WindowManager     

管理打开的窗口程序

LAYOUT_INFLATER_SERVICE

LayoutInflater    

取得xml里定义的view

ACTIVITY_SERVICE

ActivityManager   

管理应用程序的系统状态

POWER_SERVICE

PowerManger       

电源的服务

ALARM_SERVICE

AlarmManager      

闹钟的服务

NOTIFICATION_SERVICE

NotificationManager

状态栏的服务

KEYGUARD_SERVICE

KeyguardManager   

键盘锁的服务

LOCATION_SERVICE

LocationManager   

位置的服务,如GPS

SEARCH_SERVICE

SearchManager     

搜索的服务

VIBRATOR_SERVICE

Vibrator          

手机震动的服务

CONNECTIVITY_SERVICE

Connectivity      

网络连接的服务

WIFI_SERVICE

WifiManager       

Wi-Fi服务

TELEPHONY_SERVICE

TeleponyManager   

电话服务

如:

AlarmManager alarm = (AlarmManager) super.getSystemService(ALARM_SERVICE);

 

16.1. android之ConnectivityManager简介,网络连接状态

/**

  * 测试ConnectivityManager

  * ConnectivityManager主要管理和网络连接相关的操作

  * 相关的TelephonyManager则管理和手机、运营商等的相关信息;WifiManager则管理和wifi相关的信息。

  * 想访问网络状态,首先得添加权限 

  * NetworkInfo类包含了对wifi和mobile两种网络模式连接的详细描述,通过其getState()方法获取的State对象则代表着

  * 连接成功与否等状态。

  * 

  */

 public void testConnectivityManager() {

  ConnectivityManager connManager = (ConnectivityManager) this

    .getSystemService(CONNECTIVITY_SERVICE);

  // 获取代表联网状态的NetWorkInfo对象

  NetworkInfo networkInfo = connManager.getActiveNetworkInfo();

  // 获取当前的网络连接是否可用

  boolean available = networkInfo.isAvailable();

  if(available){

   Log.i("通知", "当前的网络连接可用");

  } else{

   Log.i("通知", "当前的网络连接可用");

  }

  State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

  if(State.CONNECTED==state){

   Log.i("通知", "GPRS网络已连接");

  }

  state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

  if(State.CONNECTED==state){

   Log.i("通知", "WIFI网络已连接");

  }

  // 跳转到无线网络设置界面

  startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS));

  // 跳转到无限wifi网络设置界面

  startActivity(new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS));

 }

 

上面判断网络类型的方法只是为了展示用法,其实完全可以通过networkInfo.getType()的返回值来判断。

 如:

Context context = listActivity.getApplicationContext();//获取应用上下文

ConnectivityManager connectivityManager = (ConnectivityManager) context

.getSystemService(Context.CONNECTIVITY_SERVICE);//获取系统的连接服务

NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();//获取网络的连接情况

if(activeNetInfo.getType()==ConnectivityManager.TYPE_WIFI){

//判断WIFI网

}else if(activeNetInfo.getType()==ConnectivityManager.TYPE_MOBILE) {

//判断3G网

}

16.2. Android之HttpURLConnection编程详解

16.2.1.HttpURLConnection连接URL

1)创建一个URL对象

URL url = new URL(http://www.baidu.com);

2)利用HttpURLConnection对象从网络中获取网页数据

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

3)设置连接超时

conn.setConnectTimeout(6*1000);

4)对响应码进行判断

if (conn.getResponseCode() != 200)    //从Internet获取网页,发送请求,将网页以流的形式读回来

throw new RuntimeException("请求url失败");

5)得到网络返回的输入流

InputStream is = conn.getInputStream();

6)String result = readData(is, "GBK"); //文件流输入出文件用outStream.write

7)conn.disconnect();

总结:

--记得设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作.

--返回的响应码200,是成功.

--在Android中对文件流的操作和JAVA SE上面是一样的.

--在对大文件的操作时,要将文件写到SDCard上面,不要直接写到手机内存上.

--操作大文件是,要一遍从网络上读,一遍要往SDCard上面写,减少手机内存的使用.这点很重要,面试经常会被问到.

--对文件流操作完,要记得及时关闭.

2.2.向Internet发送请求参数

步骤:

1)创建URL对象:URL realUrl = new URL(requestUrl);

2)通过HttpURLConnection对象,向网络地址发送请求

HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();

3)设置容许输出:conn.setDoOutput(true);

4)设置不使用缓存:conn.setUseCaches(false);

5)设置使用POST的方式发送:conn.setRequestMethod("POST");

6)设置维持长连接:conn.setRequestProperty("Connection", "Keep-Alive");

7)设置文件字符集:conn.setRequestProperty("Charset", "UTF-8");

8)设置文件长度:conn.setRequestProperty("Content-Length", String.valueOf(data.length));

9)设置文件类型:conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

10)以流的方式输出.

总结:

--发送POST请求必须设置允许输出

--不要使用缓存,容易出现问题.

--在开始用HttpURLConnection对象的setRequestProperty()设置,就是生成HTML文件头.

2.3.向Internet发送xml数据

XML格式是通信的标准语言,Android系统也可以通过发送XML文件传输数据.

1)将生成的XML文件写入到byte数组中,并设置为UTF-8:byte[] xmlbyte = xml.toString().getBytes("UTF-8");

2)创建URL对象,并指定地址和参数:URL url = new URL(http://localhost:8080/itcast/contanctmanage.do?method=readxml);

3)获得链接:HttpURLConnection conn = (HttpURLConnection) url.openConnection();

4)设置连接超时:conn.setConnectTimeout(6* 1000);

5)设置允许输出conn.setDoOutput(true);

6)设置不使用缓存:conn.setUseCaches(false);

7)设置以POST方式传输:conn.setRequestMethod("POST");

8)维持长连接:conn.setRequestProperty("Connection", "Keep-Alive");

9)设置字符集:conn.setRequestProperty("Charset", "UTF-8");

10)设置文件的总长度:conn.setRequestProperty("Content-Length", String.valueOf(xmlbyte.length));

11)设置文件类型:conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");

12)以文件流的方式发送xml数据:outStream.write(xmlbyte);

总结:

--我们使用的是用HTML的方式传输文件,这个方式只能传输一般在5M一下的文件.

--传输大文件不适合用HTML的方式,传输大文件我们要面向Socket编程.确保程序的稳定性

--将地址和参数存到byte数组中:byte[] data = params.toString().getBytes();

更多相关文章

  1. Android底部导航栏+消息提醒
  2. Android沉浸式标题栏迄今为止最完美的解决方案
  3. Android(安卓)Layout XML属性 及 控件属性
  4. AndroidUI自动化测试工具-UIautomator
  5. VMware安装Android全解
  6. Android(安卓)中的WiFi学习笔记----WIFI启动 代码流程走读---网
  7. 【Android开发基础】应用界面主题Theme使用方法
  8. Android基础教程——横竖切换监听、禁止、总结
  9. Android封装jar包,把当前项目设置成module,封装手机振动jar包给uni

随机推荐

  1. 掌握这几个技巧,以后用MySQL查询总比别人
  2. 从作坊到工厂 — 传统企业 DevOps 改造历
  3. 0104 函数练习
  4. MongoDB系列12:MongoDB电子商务产品目录模
  5. Java高并发编程基础三大利器之CountDownL
  6. spark源码阅读基本思路
  7. ack 挂载nas-pvc报错 mount: wrong fs ty
  8. 社区版本idea查看继承关系的骚操作
  9. 大嘴巴漫谈数据挖掘——经典案例赏析
  10. Spark 如何摆脱java双亲委托机制优先从用