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