歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android ContentObserver使用實現GPRS快捷開關

ContentObserver通過監聽database來實現GPRS快捷開關

改變GPRS的開和關的狀態我們一般調用反射就可以,如下:

public static boolean isMobileDataEnable(Context context) {//判斷是否打開
  boolean mobileDataEnabled = false; // Assume disabled
  ConnectivityManager cm = (ConnectivityManager) context
    .getSystemService(Context.CONNECTIVITY_SERVICE);
  try {
   Class cmClass = Class.forName(cm.getClass().getName());
   Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
   method.setAccessible(true); // Make the method callable
   // get the setting for "mobile data"
   mobileDataEnabled = (Boolean) method.invoke(cm);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return mobileDataEnabled;
 }

public static void setMobileDataEnabled(Context context, boolean enabled) {//開和關
  try {
   final ConnectivityManager conman = (ConnectivityManager) context
     .getSystemService(Context.CONNECTIVITY_SERVICE);
   final Class conmanClass = Class
     .forName(conman.getClass().getName());
   final Field connectivityManagerField = conmanClass
     .getDeclaredField("mService");
   connectivityManagerField.setAccessible(true);
   final Object connectivityManager = connectivityManagerField
     .get(conman);
   final Class connectivityManagerClass = Class
     .forName(connectivityManager.getClass().getName());
   final Method setMobileDataEnabledMethod = connectivityManagerClass
     .getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
   setMobileDataEnabledMethod.setAccessible(true);
   setMobileDataEnabledMethod.invoke(connectivityManager, enabled);
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
   tryToSetMobileDataEnabled(context, enabled);
  } catch (NoSuchFieldException e) {
   e.printStackTrace();
   tryToSetMobileDataEnabled(context, enabled);
  } catch (IllegalAccessException e) {
   e.printStackTrace();
   tryToSetMobileDataEnabled(context, enabled);
  } catch (NoSuchMethodException e) {
   e.printStackTrace();
   tryToSetMobileDataEnabled(context, enabled);
  } catch (InvocationTargetException e) {
   e.printStackTrace();
   tryToSetMobileDataEnabled(context, enabled);
  }
 }

那麼,我們這樣就可以實現了呀,為什麼還要用ContentObserver呢?

注意,我們通過點擊開關改變了GPRS的狀態,視圖是不是也要跟著變化,比如你的chackbutton,或者button,我們依據什麼來改變狀態呢?

上網搜一搜,發現改變了狀態之後會接受系統的ConnectivityManager_Change廣播,ConnectivityManager可以判斷狀態,實際上通過系統廣播來改變你的Button狀態實際上是不靠譜的事情。

因為  :

1.網絡狀態不單單是Gprs,還有wifi,上面的提到的廣播在wifi發生改變的時候也會接收到,再加上wifi也有一堆廣播,,經過實際實踐,用廣播來改變狀態簡直一團糟。

2.廣播有延時,你 的Button的狀態如果改變有延時的話,會給人一種卡卡的感覺,覺的你的app好卡啊。

上面的問題在使用ContentObserver之後統統不用考慮了,Observer:觀察者的意思。

如下,我們看ContentObserver怎麼用

重寫ContentObserver類,重寫onChange方法:

class MyMobileDataObserver extends ContentObserver {
  Context context;

  public MyMobileDataObserver(Context context, Handler handler) {
   super(handler);
   this.context = context;
  }

  @Override
  public void onChange(boolean selfChange) {
   // TODO Auto-generated method stub
   super.onChange(selfChange);
                        Log.i("TAG","database has change");
  }

 }

在主線程中初始化重寫的ContentObserver類:

MyMobileDataObserver dataObserver = new MyMobileDataObserver(this,
    new Handler());
  getContentResolver().registerContentObserver(
    Settings.Secure.getUriFor("mobile_data"), false, dataObserver);//"moblie_data"參數表示觀察移動數據狀態變化

當你調用反射去改變GPRS數據的時候,MyMobileDataObserver  的onCHange立刻就有了相應,你就可以在onChange方法中去跟新你的試圖界面了。

ContentObserver監聽的是你的手機的數據庫,需要一個Uri標識符,這樣就可以監聽你Uri下的數據庫了,包括表,記錄都可以。

最簡單的Ubuntu Touch & Android 雙系統安裝方式 http://www.linuxidc.com/Linux/2014-01/94881.htm

在Nexus上實現Ubuntu和Android 4.4.2 雙啟動 http://www.linuxidc.com/Linux/2014-05/101849.htm

Ubuntu 14.04 配置 Android SDK 開發環境 http://www.linuxidc.com/Linux/2014-05/101039.htm

64位Ubuntu 11.10下Android開發環境的搭建(JDK+Eclipse+ADT+Android SDK詳細) http://www.linuxidc.com/Linux/2013-06/85303.htm

Ubuntu 14.04 x64配置Android 4.4 kitkat編譯環境的方法 http://www.linuxidc.com/Linux/2014-04/101148.htm

Ubuntu 12.10 x64 安裝 Android SDK http://www.linuxidc.com/Linux/2013-03/82005.htm

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved