zoukankan      html  css  js  c++  java
  • 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设置页面。
  • 相关阅读:
    《团队-团队编程项目中国象棋-成员简介及分工》
    团队-编程项目 中国象棋-需求分析
    结对编程:贪吃蛇项目
    软件工程进阶
    JAVA第二次作业
    JAVA第一次作业
    JS解决重复绑定问题以及获取事件
    ECMAScript5学习笔记--第十四章 程序
    ECMAScript5学习笔记--第十三章 函数定义
    ECMAScript5学习笔记--第十二章 语句
  • 原文地址:https://www.cnblogs.com/BobAdmin/p/4867210.html
Copyright © 2011-2022 走看看