Service 基本组成:
在 Android 系统开发中, Service 是一个重要的组成部分,如果某些程序是不希望用户看见的,那么可以将这些程序定义在 Service 中,这样就可以完成程序的后台运行(也可以在不现实界面的形式下运行 ),即 Service 实际上相当于是一个没有图形界面的 Activity 程序,而且当用户要执行某些操作需要进行跨进程访问时,也可以用 Service 来完成。
Service 是一个没有 UI 界面的操作组件,主要功能是为 Activity 程序提供一些必要的支持,如手机中的 Mp3 播放软件等,当回到主界时这些组件依然可以运行,这些就属于 Service 的功能,在开发时,用户只需要继承 android.app.Service 类就可以完成 Service 程序的开发。
Service 的生命周期控制方法及常量:
No. | 方法及常量 | 类型 | 描述 |
1 | Public static final int START_CONTINUATION_MASK | 常量 | 继续执行 Service |
2 | Publis static final int START_STICKY | 常量 | 用于显示地启动和停止 Service |
3 | Public abstract IBinder onBind(Intent intent) | 普通 | 设置 Activity 和 Service 之间的绑定 |
4 | Public void onCreate() | 普通 | 当一个 Service 创建时笤俑 |
5 | Public int onStartCommand(Intent intent,int flags, int startId) | 普通 | 启动 Service ,由 startService() 方法触发,替代了以前的 onStart() 方法 |
6 | Public void onDestroy() | 普通 | Service 销毁时调用,由 stopService() 方法触发 |
Activity 操作 Service 的方法
No. | 方法 | 描述 |
1 | Public ComponentName startService(Intent service) | 启动一个 Service |
2 | Public Boolean stopService(Intent name) | 停止一个 Service |
3 | Public Boolean bindService(Intent service, ServiceConnection conn,int flags) | 与一个 Service 绑定 |
4 | Public void unbindService(ServiceConnection conn) | 取消与一个 Service 的绑定 |
范例:
定义用户的 Service 组件: MyServiceUtil.java
package com.iflytek.demo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyServiceUtil extends Service {
@Override
public IBinder onBind(Intent intent) {// 绑定Activity
return null; // 此处暂时不做任何的处理
}
@Override
public void onCreate() {// 创建时调用
System.out.println("*** Service onCreate()");
}
@Override
public void onDestroy() {// 销毁时调用
System.out.println("*** Service onDestroy()");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {// 开始Service
System.out.println("*** Service onStartCommand");
return Service.START_CONTINUATION_MASK; // 继续执行Service
}
}
与Activity最大的区别在于此处只是提供了一些后台的操作。
Service01Activity.java
package com.iflytek.demo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Service01Activity extends Activity {
private Button start;
private Button stop;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.start = (Button) super.findViewById(R.id.start);
this.stop = (Button) super.findViewById(R.id.stop);
this.start.setOnClickListener(new StartOnClickListenerImpl());
this.stop.setOnClickListener(new StopOnClickListenerImpl());
}
private class StartOnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
Service01Activity.this.startService(new Intent(
Service01Activity.this, MyServiceUtil.class));
}
}
private class StopOnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
Service01Activity.this.stopService(new Intent(
Service01Activity.this, MyServiceUtil.class));
}
}
}
在AndroidManifest.xml中添加:
<service android:name=".MyServiceUtil" />
运行结果:
点击“启动Service”按钮: 10-28 20:40:18.225: I/System.out(7081): *** Service onCreate() 10-28 20:40:18.230: I/System.out(7081): *** Service onStartCommand 重复点击“启动Service”按钮: 10-28 20:42:10.875: I/System.out(7331): *** Service onStartCommand 单击“结束Service”按钮: 10-28 20:42:52.860: I/System.out(7353): *** Service onDestroy()
绑定 Service:
当一个 Service 程序启动之后,如果没有出现意外且调用 stopService() 方法,则将会一直留在手机的服务之中,如果希望由 Activity 启动的 Service 程序可以在 Activity 程序结束后自动结束,则可以将 Activity 和 Service 程序进行绑定。
ServiceConnection 接口定义方法
No. | 方法 | 描述 |
1 | Public abstract void onServiceConnected(ComponentName name ,IBinder service) | 当与一个 Service 建立连接时调用 |
2 | Public abstract void onServiceDisconnected(ComponentName name) | 当与一个 Service 取消连接时调用 |
所以我们可以发现 Service 与 ServiceConnection 的联系,默认情况下,当一个 Activity 程序启动 Service 之后,该 Service 程序是在后台独自运行的,与前台的 Activity 就没有关系了,而使用 ServiceConnection 就表示该 Service 永远要和这个 Activity 程序绑定在一期,不再是独立运行了。
MyServiceUtil.java
package com.iflytek.demo;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class MyServiceUtil extends Service {
private IBinder myBinder = new Binder() {
@Override
public String getInterfaceDescriptor() {// 取得接口描述信息
return "MyServiceUitl Class ..";// 返回Service类的名称
}
};
@Override
public IBinder onBind(Intent intent) {// 绑定时触发
System.out.println("*** Service onBind()");
return this.myBinder; // 此处暂时不做任何的处理
}
@Override
public void onRebind(Intent intent) {// 重新绑定时触发
System.out.println("*** Service onRebind()");
super.onRebind(intent);
}
@Override
public boolean onUnbind(Intent intent) {// 接触绑定时触发
System.out.println("*** Service onUnbind()");
return super.onUnbind(intent);
}
@Override
public void onCreate() {// 创建时触发
System.out.println("*** Service onCreate()");
}
@Override
public void onDestroy() {// 销毁时触发
System.out.println("*** Service onDestroy()");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {// 启动时触发
System.out.println("*** Service onStartCommand");
return Service.START_CONTINUATION_MASK; // 继续执行
}
}
Service02_Activity.java
package com.iflytek.demo;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Service02_Activity extends Activity {
private Button start;
private Button stop;
private Button bind;
private Button unbind;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {// 连接到Service
try {
System.out.println("### Service Connect Success . service = "
+ service.getInterfaceDescriptor());
} catch (RemoteException e) {
}
}
@Override
public void onServiceDisconnected(ComponentName name) {// 与Service断开连接
System.out.println("### Service Connect Failure.");
}// 接受服务状态
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.start = (Button) super.findViewById(R.id.start);
this.stop = (Button) super.findViewById(R.id.stop);
this.bind = (Button) super.findViewById(R.id.bind);
this.unbind = (Button) super.findViewById(R.id.unbind);
this.start.setOnClickListener(new StartOnClickListenerImpl());
this.stop.setOnClickListener(new StopOnClickListenerImpl());
this.bind.setOnClickListener(new BindOnClickListenerImpl());
this.unbind.setOnClickListener(new UnbindOnClickListenerImpl());
}
private class StartOnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
Service02_Activity.this.startService(new Intent(// 启动Service
Service02_Activity.this, MyServiceUtil.class));
}
}
private class StopOnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
Service02_Activity.this.stopService(new Intent(// 停止Service
Service02_Activity.this, MyServiceUtil.class));
}
}
private class BindOnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {// 绑定Service
Service02_Activity.this.bindService(new Intent(
Service02_Activity.this, MyServiceUtil.class),
Service02_Activity.this.serviceConnection,
Context.BIND_AUTO_CREATE);
}
}
private class UnbindOnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {// 取消Service
Service02_Activity.this
.unbindService(Service02_Activity.this.serviceConnection);
}
}
}
运行结果:
(1) 单击“启动Service”按钮: 10-28 21:42:10.950: I/System.out(8093): *** Service onCreate() 10-28 21:42:10.950: I/System.out(8093): *** Service onStartCommand (2) 单击“绑定Service”按钮: 10-28 21:43:55.620: I/System.out(8237): *** Service onBind() 10-28 21:43:55.640: I/System.out(8237): ### Service Connect Success . service = MyServiceUitl Class .. (3) 取消1,2,直接单击“绑定Service”按钮: 10-28 21:48:31.200: I/System.out(8638): *** Service onCreate() 10-28 21:48:31.205: I/System.out(8638): *** Service onBind() 10-28 21:48:31.225: I/System.out(8638): ### Service Connect Success . service = MyServiceUitl Class .. (4) 不单击“停止”,直接退出Activity程序 10-28 21:50:06.565: I/System.out(8708): *** Service onUnbind() 当服务启动后,实际上就在手机系统的后台了,因为Activity程序被关闭后,与Service连接的Activity就消失了,所以此处要解除与Activity程序的绑定,但服务不会销毁。 (5) 返回Activity程序,单击 “绑定Service”按钮: 10-28 21:51:31.225: I/System.out(8638): ### Service Connect Success . service = MyServiceUitl Class .. 当用户再次回到Activity程序之后,则可以重新取得一个Activity与Service之间绑定的ServiceConnect接口对象 (6) 单击“解除绑定Service”按钮: 10-28 21:52:06.565: I/System.out(8708): *** Service onUnbind() (7) 单击“停止Service”按钮: 10-28 21:52:06.570: I/System.out(8708): *** Service onDestroy()
如果没有服务与Activity进行绑定而又调用了解除绑定操作,则会出现错误,所以,在解除绑定之前必须要增加一个判断,判断一个Activity是否和一个Service绑定在一期,如果绑定在一起,才可以使用unbindService()方法解除绑定。
但是遗憾的是,在Android中并没有提供这样的一个判断方法,所以一般的做法是定义一个标记性的操作接口,而后台Activity中判断此接口对象是否为null来决定是否绑定了Service。
定义一个标记性接口IService.java
package com.iflytek.demo;
/**
*
* @author xdwang
*
* @create 2012-10-28 下午10:02:23
*
* @email:xdwangiflytek@gmail.com
*
* @description 标记性接口
*
*/
public interface IService {
}
定义服务类MyServiceUtil.java
package com.iflytek.demo;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class MyServiceUtil extends Service {
private IBinder myBinder = new BinderImpl();
@Override
public IBinder onBind(Intent intent) {
System.out.println("*** Service onBind()");
return this.myBinder; // 此处暂时不做任何的处理
}
class BinderImpl extends Binder implements IService {//这里多实现一个接口
@Override
public String getInterfaceDescriptor() {
return "MyServiceUitl Class ..";
}
}
}
BinderImpl多实现了一个IService接口,这样以后就可以通过ServiceConnection中的onServiceConnected()方法取得此IService子类对象
Service03_Activity.java
package com.iflytek.demo;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.iflytek.demo.MyServiceUtil.BinderImpl;
public class Service03_Activity extends Activity {
private Button bind;
private Button unbind;
private IService service = null;
private ServiceConnection serviceConnection = new ServiceConnectionImpl();
private class ServiceConnectionImpl implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Service03_Activity.this.service = (BinderImpl) service;
// BinderImpl是IBinder接口的子类,所以将IBinder向下转型为BinderImpl类
// 而后通过此类对象为Service接口实例化
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.bind = (Button) super.findViewById(R.id.bind);
this.unbind = (Button) super.findViewById(R.id.unbind);
this.bind.setOnClickListener(new BindOnClickListenerImpl());
this.unbind.setOnClickListener(new UnbindOnClickListenerImpl());
}
private class BindOnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
Service03_Activity.this.bindService(new Intent(
Service03_Activity.this, MyServiceUtil.class),
Service03_Activity.this.serviceConnection,
Context.BIND_AUTO_CREATE);
}
}
private class UnbindOnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
if (Service03_Activity.this.service != null) {
Service03_Activity.this
.unbindService(Service03_Activity.this.serviceConnection);
Service03_Activity.this.service = null;
}
}
}
}
操作系统服务:
在 Android 系统中也提供了一些系统服务,为了方便操作这些系统服务,在 android.content.Context 类中将所有的系统服务名称以常量的形式进行了绑定,用户使用时直接利用 getSystemService() 方法指定好服务的名称就可以取得。 Context 类中定义的系统服务:
No. | 常量 | 描述 |
1 | public static final String CLIPBOARD_SERVICE | 剪贴板服务 |
2 | public static final String WINDOW_SERVICE | 窗口服务 |
3 | public static final String ALARM_SERVICE | 闹铃服务 |
4 | public static final String AUDIO_SERVICE | 音频服务 |
5 | public static final String NOTIFICATION_SERVICE | Notification 服务 |
6 | public static final String SEARCH_SERVICE | 搜索服务 |
7 | public static final String POWER_SERVICE | 电源管理服务 |
8 | public static final String WIFI_SERVICE | WiFi 服务 |
9 | public static final String ACTIVITY_SERVICE | 运行程序服务 |
具体可以查询相关 Android 文档。
一、 系统剪贴板服务
Service04_Activity.java
package com.iflytek.demo;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.ClipboardManager;
public class Service04_Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
ClipboardManager clipboardManager = (ClipboardManager) super
.getSystemService(Context.CLIPBOARD_SERVICE); // 取得剪贴板服务
clipboardManager.setText("XDWANG");//设置剪贴板中的内容
}
}
一、 取得正在进行的进程信息
在 Android 系统中可以通过 super.getSystemService() 方法取得 android.app.ActivityManager ,此类的常用方法有:
No. | 方法 | 描述 |
1 | Public List<ActivityManager.RunningAppProcessInfo> getRunningAppProcesses() | 取得所有正在运行的进程信息 |
2 | Public List<ActivityManager.RunningServiceInfo> getRunningServices(int maxNum) | 取得指定个数的服务信息 |
3 | Public List<ActivityManager.RunningTaskInfo> getRunningTasks(int maxNum) | 取得指定个数的任务信息 |
4 | Public void killBackgroundProcesses(String packageName) | 销毁一个后台进程,必须设置 KILL_BACKGROUND_PROCESSES 权限 |
5 | Public ConfigurationInfo getDeviceConfigurationInfo() | 取得设备的配置信息 |
1 、取得正在运行的 Activity 程序: ActivityManager.RunningTaskInfo
No. | 属性 | 描述 |
1 | Public ComponentName baseActivity | 取得程序运行开始的 Activity |
2 | Public CharSequence description | 取得该 Activity 的描述信息 |
3 | Public int id | 取得任务的唯一 ID |
4 | Public int numActivities | 取得所有运行的 Activity 数量,包括已停止的 |
5 | Public int numRunning | 取得所有运行的 Activity 数量,不含已停止的 |
6 | Public Bitmap thumbnail | 取得任务的图标 |
7 | Public Component topActivity | 取得当前用户正在操作的 Activity 信息 |
Service05_Activity.java
package com.iflytek.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
public class Service05_Activity extends Activity {
private ListView tasklist = null;
private ListAdapter adapter = null;
private List<String> all = new ArrayList<String>();
private ActivityManager activityManager = null;
private List<ActivityManager.RunningTaskInfo> allTaskInfo;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.tasklist = (ListView) super.findViewById(R.id.tasklist);
this.activityManager = (ActivityManager) super
.getSystemService(Context.ACTIVITY_SERVICE);
this.listActivity();
}
private void listActivity() {
this.allTaskInfo = this.activityManager.getRunningTasks(30); // 返回30条
Iterator<ActivityManager.RunningTaskInfo> iterInfo = this.allTaskInfo
.iterator();
while (iterInfo.hasNext()) {
ActivityManager.RunningTaskInfo task = iterInfo.next();
this.all.add("【ID = " + task.id + " 】 "
+ task.baseActivity.getClassName());
}
this.adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, this.all);
this.tasklist.setAdapter(this.adapter);
}
}
添加权限:
<uses-permission android:name="android.permission.GET_TASKS" />
2 、取得后台运行的服务信息: ActivityManager.RunningServiceInfo
No. | 属性 | 描述 |
1 | Public long activeSince | 服务从启动到现在所运行的时间 |
2 | Public int clientCount | 返回连接到此服务的客户端数量 |
3 | Public int crashCount | 返回该服务在运行中的死机次数 |
4 | Public Boolean foreground | 如果为 true 则表示服务在后台运行 |
5 | Pulibc long lashActivityTime | 最后一个 Activity 与服务的绑定时间 |
6 | Public int pid | 服务的 ID ,如果不是 0 则表示正在运行 |
7 | Public String process | 取得服务的名称 |
8 | Public long restarting | 如果不为 0 ,则表示不是运行中的服务,预计会在指定的时间内启动 |
9 | Public ComponentName service | 取得服务的组件对象 |
10 | Public Boolean started | 若服务正在运行则此值为 true |
11 | Public int uid | 此服务的 UID |
Service06_Activity.java
package com.iflytek.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
public class Service06_Activity extends Activity {
private ListView tasklist = null;
private ListAdapter adapter = null;
private List<String> all = new ArrayList<String>();
private ActivityManager activityManager = null;
private List<ActivityManager.RunningServiceInfo> allTaskInfo;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.tasklist = (ListView) super.findViewById(R.id.tasklist);
this.activityManager = (ActivityManager) super
.getSystemService(Context.ACTIVITY_SERVICE);
this.listActivity();
}
private void listActivity() {
this.allTaskInfo = this.activityManager.getRunningServices(30);
Iterator<ActivityManager.RunningServiceInfo> iterInfo = this.allTaskInfo
.iterator();
while (iterInfo.hasNext()) {
ActivityManager.RunningServiceInfo service = iterInfo.next();
this.all.add("【ID = " + service.pid + " 】 " + service.process);
}
this.adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, this.all);
this.tasklist.setAdapter(this.adapter);
}
}
3 、取得所有的正在运行进程信息: ActivityManager.RunningAppProcessInfo
No. | 属性 | 描述 |
1 | Public int importance | 取得进程的重要性代码 |
2 | Public int importanceReasonCode | 取得进程的重要性原因代码 |
3 | Public ComponentName importanceReasonComponent | 取得进程重要性原因的客户端组件 |
4 | Public int importanceReasonPid | 取得进程重要性原因的客户端进程 ID ,如果是 0 则表示没有客户端使用此进程 |
5 | Public int pid | 取得进程的 PID |
6 | Public String[] pkgList | 取得所有已经加载到进程的程序包 |
7 | Public String processName | 取得进程的名称 |
8 | Public static final int IMPORTANCE_BACKGROUND | 进程重要性代码:表示在后台运行 |
9 | Public static final int IMPORTANCE_EMPTY | 进程重要性代码:没有程序执行此进程 |
10 | Public static final int IMPORTANCE_FOREGROUND | 进程重要性代码:此进程运行在前台 UI |
11 | Public static final int IMPORTANCE_PERCEPTIBLE | 进程重要性代码:此进程正在运行 |
12 | Public static final int IMPORTANCE_SERVICE | 进程重要性代码:此进程是继承保持运行的服务 |
13 | Public static final int IMPORTANCE_VISIBLE | 进程重要性代码:该线程还没有运行在前台,但是正准备在前台运行 |
Service07_Activity.java
package com.iflytek.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
public class Service07_Activity extends Activity {
private ListView tasklist = null;
private ListAdapter adapter = null;
private List<String> all = new ArrayList<String>();
private ActivityManager activityManager = null;
private List<ActivityManager.RunningAppProcessInfo> allTaskInfo;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.tasklist = (ListView) super.findViewById(R.id.tasklist);
this.activityManager = (ActivityManager) super
.getSystemService(Context.ACTIVITY_SERVICE);
this.listActivity();
}
private void listActivity() {
this.allTaskInfo = this.activityManager.getRunningAppProcesses();
Iterator<ActivityManager.RunningAppProcessInfo> iterInfo = this.allTaskInfo
.iterator();
while (iterInfo.hasNext()) {
ActivityManager.RunningAppProcessInfo app = iterInfo.next();
this.all.add("【ID = " + app.pid + " 】 " + app.processName);
}
this.adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, this.all);
this.tasklist.setAdapter(this.adapter);
}
}
三、 取得手机网络信息
在 Android 中,用户可以直接使用 getSystemService() 方法通过 Context.TELEPHONY_SERVICE 取得手机网络的相关信息, android.telephony.TelephonyManager
No. | 常量及方法 | 描述 |
1 | Public static final int NETWORK_TYPE_CDMA | 使用 CDMA 网络 |
2 | Public static final int NETWORK_TYPE_GPRS | 使用 GPRS 网络 |
3 | Public static final int PHONE_TYPE_CDMA | 使用 CDMA 通信 |
4 | Public static final int PHONE_TYPE_CDMA | 使用 GPRS 同学 |
5 | Public String getLine1Number | 取得手机号码 |
6 | Public String getNetworkOperatorName() | 取得移动提供商的名称 |
7 | Public int getNetworkType() | 取得移动网络的连接类型 |
8 | Public int getPhoneType() | 取得电话网络类型 |
9 | Public Boolean isNetworkRoaming() | 判断电话是否处于漫游状态 |
10 | Public void listen(OhoneStateListener listener,int events) | 注册电话状态监听器 |
Service08_Activity.java
package com.iflytek.demo;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
public class Service08_Activity extends Activity {
private ListView infolist = null;
private ListAdapter adapter = null;
private List<String> all = new ArrayList<String>();
private TelephonyManager manager = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.infolist = (ListView) super.findViewById(R.id.infolist);
this.manager = (TelephonyManager) super
.getSystemService(Context.TELEPHONY_SERVICE); // 电话服务
this.list();
}
private void list() { // 列出一些信息
this.all.add(this.manager.getLine1Number() == null ? "没有手机号码" : "手机号码:"
+ this.manager.getLine1Number());
this.all.add(this.manager.getNetworkOperatorName() == null ? "没有移动服务商"
: "移动服务商:" + this.manager.getNetworkOperatorName());
if (this.manager.getPhoneType() == TelephonyManager.NETWORK_TYPE_CDMA) {
this.all.add("移动网络:CDMA");
} else if (this.manager.getPhoneType() == TelephonyManager.NETWORK_TYPE_GPRS) {
this.all.add("移动网络:GPRS");
} else {
this.all.add("移动网络:未知");
}
if (this.manager.getNetworkType() == TelephonyManager.PHONE_TYPE_GSM) {
this.all.add("网络类型:GSM");
} else if (this.manager.getNetworkType() == TelephonyManager.PHONE_TYPE_CDMA) {
this.all.add("网络类型:CDMA");
} else {
this.all.add("网络类型:未知");
}
this.all.add("是否漫游:" + (this.manager.isNetworkRoaming() ? "漫游" : "非漫游"));
this.adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, this.all);
this.infolist.setAdapter(this.adapter);
}
}
添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission>
四、 取得 WiFi 操作
在 Android 中,用户可以直接使用 getSystemService() 方法通过 Context.WIFI_SERVICE 取得手机网络的相关信息, android.net.wifi.WifiManager
No. | 常量及方法 | 描述 |
1 | Public static final int WIFI_STATE_DISABLED | 已关闭 WiFi 连接,数值为 1 |
2 | Public static final int WIFI_STATE_DISABLING | 正在关闭 WiFi 连接,数值为 0 |
3 | Public static final int WIFI_STATE_ENABLED | 已启用 WiFi 连接,数值为 3 |
4 | Public static final int WIFI_STATE_ENABLING | 正在启用 WiFi 连接,数值为 2 |
5 | Public static final int WIFI_STATE_UNKNOWN | 未知的 WiFi 状态,数值为 4 |
6 | Public boolean setWifiEnabled(Boolean enabled) | 设置 WiFi 是否启用, true 为启用, false 为关闭 |
7 | Public Boolean isWifiEnabled | 返回启用状态 |
8 | Public Boolean reconnect() | 重新连接接入点网络 |
9 | Public Boolean disconnect() | 断开当前接入点 |
10 | Public int getWifiState() | 返回 WiFi 状态,返回数值为表中的 5 个常量 |
Service09_Activity.java
package com.iflytek.demo;
import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class Service09_Activity extends Activity {
private Button open = null;
private Button close = null;
private Button check = null;
private TextView msg = null;
private WifiManager wifiManager = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.open = (Button) super.findViewById(R.id.open);
this.close = (Button) super.findViewById(R.id.close);
this.check = (Button) super.findViewById(R.id.check);
this.msg = (TextView) super.findViewById(R.id.msg);
this.wifiManager = (WifiManager) super
.getSystemService(Context.WIFI_SERVICE);
this.open.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Service09_Activity.this.wifiManager.setWifiEnabled(true); // 启用wifi
Service09_Activity.this.msg.setText("打开WIFI,状态:"
+ Service09_Activity.this.wifiManager.getWifiState());
}
});
this.close.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Service09_Activity.this.wifiManager.setWifiEnabled(false); // 启用wifi
Service09_Activity.this.msg.setText("打开WIFI,状态:"
+ Service09_Activity.this.wifiManager.getWifiState());
}
});
this.check.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Service09_Activity.this.msg.setText("检查WIFI,状态:"
+ Service09_Activity.this.wifiManager.getWifiState());
}
});
}
}
添加权限:
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>