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设置页面。