`

Android学习10-----Android组件通信 (5) Service

阅读更多

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"/>

 

 

分享到:
评论

相关推荐

    android各组件详解- Service

    android各组件详解- Service

    Android_Service通信

    Android下的服务与其他组件之间的通信,跨进程通信等示例。具体可以参见博客:http://www.cnblogs.com/plokmju/p/android_ServiceCommunication.html

    移动安全系列教学下载共43份.zip

    Android安全开发基础--10--图形界面(UI)和碎片(Fragment)(上).pdf Android安全开发基础--11--图形界面(UI)和碎片(Fragment)(下).pdf Android安全开发基础--12--持久化技术.pdf Android安全开发基础--13-...

    Android高级编程--源代码

    作者简介 -10 前言 -9 目录 -4 第1章 Android简介 1 1.1 一些背景信息 2 1.1.1 不远的过去 2 1.1.2 未来的前景 2 1.2 对Android的误解 3 1.3 开放的移动开发平台 3 1.4 自带的Android应用程序 4 1.5 Android ...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android组件通信和后台服务实验报告.pdf

    Android组件通信和后台服务实验报告.pdf

    Android开发四大组件之Service应用总结Demo

    service的启动,停止,绑定,取消绑定,以及IntentService的生命周期走向测试和IntentService与访问者信息通信过程,不清楚之处请参阅我的博客《Android开发四大组件之Service总结》

    android大作业-安卓音乐播放器+源代码+文档说明+演示视频

    2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...

    Android应用开发从入门到精通 android studio code 1-10章

     Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等;  还讲解了Android开发的高级技术:  Camera、地图、GPS、...

    Android自学视频教程 part1

    第1篇为入门篇,主要包括Android入门、搭建Android开发环境、认识Android模拟器、剖析Android程序、Android常用组件的使用、掌握布局管理器、Android程序调试与错误处理、Activity的使用和使用Intent进行通信等内容...

    Android服务Service详解

    本章内容服务(Service)是Android系统中4个应用程序组件之一(其他的组件详见3.2节的内容)。服务主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样...

    Android Service测试例子

    Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是...

    binder 测试 service client

    该项目,是参考《Android 系统源代码情景分析 罗升阳.pdf》 5.3 Binder进程间通信应用实例; 在 Android 2.3.7 源码中使用; 1 把 binder 目录,拷贝到源码的 external 目录下; 2 在根目录下,编译: mmm ./...

    BService:活动-Android组件之间的服务交互示例

    服务 关键字:Android,服务,辅助,可打包,RemoteCallbackList Activity-Android组件之间的服务交互示例,这是Activity-Service之间的Android组件通信示例。 执照 Apache许可证版本2.0

    Android服务Service_详解.pdf

    服务(Service)是Android 系统中4 个应用程序组件之一(其他的组件详见3.2 节的内容)。服务主要 用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定 的任务,这样...

    Android自学视频教程 part2

    第1篇为入门篇,主要包括Android入门、搭建Android开发环境、认识Android模拟器、剖析Android程序、Android常用组件的使用、掌握布局管理器、Android程序调试与错误处理、Activity的使用和使用Intent进行通信等内容...

    Android系统源代码情景分析-罗升阳-源码

    第10章 Content Provider组件的实现原理 10.1 Content Provider组件应用实例 10.1.1 ArticlesProvider 10.1.2 Article 10.2 Content Provider组件的启动过程 10.3 Content Provider组件的数据共享原理 10.3.1...

    Android 系统开发技术课程设计 实验任务书及实验报告

    资源包含十一个实验任务书及实验报告(报告已完成) 实验1构建Android开发环境和Android应用程序 实验2基本视图组件的使用(一) 实验3:基本视图组件的使用(二...实验10 基于SQLite的通信录 实验11 基于文件的日程安排

    Android Service客户端测试例子

    Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是...

    Android应用开发从入门到精通 android studio code 11-17章

     Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等;  还讲解了Android开发的高级技术:  Camera、地图、GPS、...

Global site tag (gtag.js) - Google Analytics