Android Service

Android Service 和BroadCast 、Activity、以及ContentProvider并称为安卓四大组件。在日常开发中接触最多的是Activity,因为android其实就是一个与用户直接交互的平台,所以作为这个平台的人机转换器(我在这里这么说的)---Activity就是在安卓开发中应用的最多的了。其他三大组件只在一些比较特殊的时候用到,所以接触的比较少。而真正的技术一般都是要经过不断的练习才能更熟悉,更精通,如果只是偶尔的用用就会比较生疏了。

好了,进入正题,在开发的时候偶尔用到了Service,这个服务是在监听应用的网络状况的时候用到的。类名为CheckNetStateService ,该类继承自Service。在这个服务里监听应用的网络状态。具体代码如下。

public class CheckNetStateService extends Service {
	public static boolean isNetConnected = true;
	private boolean isRunning;
	private boolean flag = true;
	private ActivityManager mActivityManager;
	private ExitBroadcastReceiver exitBroadcastReceiver;
	private IntentFilter filter;
	private ConfirmDialog confirmDialog;
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	
	@Override
	public void onCreate() {
		super.onCreate();
		mActivityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
		checkNetState();
	}
	
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		if(filter == null){
			filter = new IntentFilter();
		}
		if(exitBroadcastReceiver == null){
			exitBroadcastReceiver = new ExitBroadcastReceiver();
		}
		filter.addAction("com.xianglin.station.service.CheckNetStateService");
		getApplicationContext().registerReceiver(exitBroadcastReceiver, filter);
		
		if(!flag){
			checkNetState();
		}
		return super.onStartCommand(intent, flags, startId);
	}
	
	public void checkNetState(){
		new Thread(new Runnable() {
			@Override
			public void run() {
				flag = true;
				isRunning = true;
				while(isRunning){
//					LogCatLog.i(TAG,"CheckNetStateService is Running!!!");//测试时打开
					
					SystemClock.sleep(1000);
					isNetConnected = WeidiUtils.isNetworkConnected(getApplicationContext());
					if(!isCurrentApp()){
						onDestroy();
						break;
					}
					if(!isNetConnected){
						flag = false;
						Looper.prepare();
						if(confirmDialog == null){
							confirmDialog = new ConfirmDialog(getApplicationContext(), "网络异常", "没有可用的网络!!!", "去设置");//这是我工程里面封装的一个提示类
						}
						confirmDialog.setOnDismissListener(new OnDismissListener(){
							@Override
							public void OnConfirmed(Boolean confirmed) {//去设置
								if(confirmed){
									Intent intent = new Intent();
									intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
									if (android.os.Build.VERSION.SDK_INT > 10) {
										// 3.0以上打开设置界面,也可以直接用ACTION_WIRELESS_SETTINGS打开到wifi界面
										intent.setAction(android.provider.Settings.ACTION_WIFI_SETTINGS);
										startActivity(intent);
									} else {
										intent.setAction(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
										startActivity(intent);
									}
									confirmDialog = null;
								}else{
									confirmDialog = null;
									if(!WeidiUtils.isNetworkConnected(getApplicationContext())){
										onDestroy();
										android.os.Process.killProcess(android.os.Process.myPid());
										
									}
								}
							}
						});
						if(confirmDialog != null && !confirmDialog.isShowing()){
							confirmDialog.show();
						}
						Looper.loop();
					}
				}
			}
		}).start();
	}
	
	@Override
	public void onDestroy() {
		super.onDestroy();
		isRunning = false;
		flag = false;
		if(exitBroadcastReceiver != null){
			getApplicationContext().unregisterReceiver(exitBroadcastReceiver);
			exitBroadcastReceiver = null;
		}
	}
}

  可以看到在这个类里面用到了IntentFilter这个类,该类是一个意图过滤器,顾名思义,IntentFilter对象负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。 IntentFilter实行“白名单”管理,即只列出组件乐意接受的Intent,但IntentFilter只会过滤隐式Intent,显式的Intent会直接传送到目标组件。 Android组件可以有一个或多个IntentFilter,每个IntentFilter之间相互独立,只需要其中一个验证通过则可。除了用于过滤广播的IntentFilter可以在代码中创建外,其他的IntentFilter必须在AndroidManifest.xml文件中进行声明。

在程序中开启一个线程对网络状态进行实时监听,如果网络连接异常,则通过

intent.setAction(android.provider.Settings.ACTION_WIFI_SETTINGS)跳转到WiFi设置页面。
posted @ 2015-10-10 15:32  bob_admin  阅读(844)  评论(0编辑  收藏  举报