-
如圖,是獲取 WIFI 狀態,然后做開啟或關閉 WIFI 的操作。 同樣要先獲取權限: <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 讀取WiFi狀態 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 改變WiFi狀態查看全部
-
安卓系統默認對于一些比較危險的操作或者高權限的操作都要求必須具有權限才能執行,例如發送短信、讀取通訊錄、打開/關閉WiFi等等。 例如這節課的示例是要查看網絡狀態,就需要添加相應權限: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses> 添加這個權限后,用戶在安裝這個應用的時候,安裝界面就會提示該應用需要獲取網絡狀態。 判斷網絡是否連接: 編寫一個判斷網絡連接的類 isNetworkConnected(Context context),之所以要使用上下文作為參數,是因為使用系統服務要用到 context: public boolean isNetworkConnected(Context context) { // 判斷網絡的方法 if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(CONNECTIVITY_SERVICE); NetworkInfo mNetworkInfo = mConnectivityManager .getActiveNetworkInfo();// 獲取網絡連接狀態信息 if (mNetworkInfo != null) {// 如果不為空 return mNetworkInfo.isAvailable();// 返回網絡狀態屬于活動狀態 } } return false; }查看全部
-
SQLite的特點查看全部
-
常用系統服務3查看全部
-
常用系統服務2查看全部
-
常用的系統服務查看全部
-
點擊事件 case R.id.bind://綁定服務 intent2=new Intent(MainActivity.this,MyBindService.class); startService(intent2);//StartService 和 BindService相結合實現服務(要在onDestroy銷毀),去掉就是單獨的BinderService。 bindService(intent2, connection, BIND_AUTO_CREATE);//第二個參數是連接對象,第三個參數是必須要填的一個常量,沒寫的話將無法自動創建Service。 break; case R.id.Unbind:// 解綁服務 unbindService(connection); break; 單純使用 BindService還是有很多隱患的。實際上可以結合 StartService 和 BindService。如圖,使用同一個通信 intent2 ,就可以實現。 但比較麻煩的是,你打開了服務,就要相應地去關閉服務,所以要在 MainActivity 中重寫 onDestroy()方法: @Override protected void onDestroy() { // TODO Auto-generated method stub stopService(intent2); unbindService(connection);//解綁 super.onDestroy(); } 這樣在 Activity 被銷毀的時候,就會停止服務,并解除了綁定。這樣一來,即使程序被強制退出,也不會報錯(之前會報一些和Service相關的錯)。 注意:解綁只能使用一次,多次使用會報錯,另外當啟動源在沒有解綁的情況下退出程序也會報錯。 摘自評論區: bindService();方法中的第二個參數必須實現,ServiceConnection conn = new ServiceConnection(){};里邊有兩個方法可以暫時不管。如果寫成null是會報錯的。查看全部
-
在MyBindService類中: //IBinder接口不能直接用,重寫一個類來繼承Binder類把他作為IBinder參數返回即可 public class MyBinder extends Binder { public MyBindService getService(){//獲取服務,并返回給服務本身 return MyBindService.this; } } //通過IBinder接口實例,返回一個ServiceConnection對象給啟動預案 @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.i("info", "Service--onBind()"); return new MyBinder();//新建的MyBinder作為IBinder的返回值 } 在MainActivity類: MyBindService service; //通過ServiceConnection對象的相關方法可以得到Service對象,用來實現service端到客服端的綁定 ServiceConnection connection=new ServiceConnection() { //當啟動源跟Service的連接意外丟失的時候回調用這個方法,比如當Service崩潰或者被強行殺死了 @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } //當啟動源跟Service成功連接之后將會自動調用這個方法 @Override public void onServiceConnected(ComponentName name, IBinder binder) { // TODO Auto-generated method stub service=((MyBinder)binder).getService();//大類轉化為自身的小類,獲取內部類中的方法,從而獲得服務本身 } };查看全部
-
service啟動式服務: 1、創建一個類繼承Service(后面該類將作為Intent通信的對象之一),實現幾個方法: public void onCreate() { // 由于只執行一次,一般把初始化操作放在這里 super.onCreate();//當服務被創建時,會執行該方法。 } public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId);//當有開啟服務的命令時,會調用該方法。 } public void onDestroy() { super.onDestroy(); } // IBinder是一個抽象的方法,這里用不到 public IBinder onBind(Intent intent) { return null; } 3. 在配置文件中注冊服務 <service android:name=".MyStartService"/> 4. 如圖,編寫點擊事件: public void doClick(View view){ switch (view.getId()){ case R.id.btn_start: // 開始服務 intent1 = new Intent(this,MyStartService.class); // Intent 實現組件之間的通信,這里是Activity和Service之間。 startService(intent1); // 和以前的 stratActivity() 很類似。 break; case R.id.btn_stop: // 停止服務 stopService(intent1); break; } } 注意事項: 1.一個服務只能啟動一次。如果再次啟動,會調用onStartCommand方法 2.服務不能進行耗時操作,但是服務可以開辟線程來完成耗時操作 3.停止服務會調用onDestroy方法。但是如果再次停止服務,將什么都不會發生查看全部
-
1. 本地服務(Local Service) - 應用程序內部 - startService(啟動服務)、stopService(在“啟動源”或者 Activity 中停止服務)、stopSelf(在Service停止服務)、stopSelfResult(在Service中停止服務),后面兩種都是服務的自我停止。 - bindService(綁定服務)、unbindService(解綁) 通過 startService 或者 bindService 都可以啟動服務。 2. 遠程服務(Remote Service) - Android系統內部的應用程序之間(不是手機之間) - 定義 IBinder 接口,通過它,把數據暴露出來,然后把數據提供給啟動源或者其他程序。 遠程服務只能通過 IBinder 去啟動服務。 -------------- 我們知道一個Activity是有生命周期的,并且必須在配置文檔中進行注冊。而Service和Activity是類似的,有類似的生命周期,也必須注冊。 繼承關系: Service 繼承 ContextWrapper,Activity 繼承 ContextThemeWrapper,二者共同擁有一個“祖宗類”——Context。 ------------------ 如圖所示是 Service 的兩種生命周期(分別以startService和bindService啟動)。 Start方式特點: - 服務跟啟動源沒有任何聯系 - 無法得到服務對象 Bind方式特點: - 通過 Ibinder 接口實例,返回一個ServiceConnection對象給啟動源 - 通過 ServiceConnection對象的相關方法可以得到Service對象查看全部
-
組件篇——Service 當Android系統內存不足的時候,會殺死優先級別較低的Activity,而基本上Service的優先級要高于Activity,所以程序中如果含有 Service,那么該程序是很難被殺掉的,而且即使 Service 被殺掉,它也很容易自己再次啟動,除非人為去停掉。 ------------------- Service 本身不能做耗時操作(因為它運行在主線程)。耗時操作交給 Handle 或者 AsyncTask 去處理。查看全部
-
怎么用好BroadcastRecevier查看全部
-
異步廣播之所以又叫“粘滯性廣播”,是因為它的廣播會一直存在,不像其他廣播一用完就會被銷毀。所以這里的示例將采取“先發送廣播,后注冊接收者”,如果接收者還能接收到廣播,就能說明異步廣播的“粘滯性”。 注意:“粘滯性”是需要在配置文件中添加權限的: <uses-permission android:name="android.permission.BROADCAST_STICKY"></uses> 并且當我們用動態注冊時,我們應該在activity的ondestroy方法中銷毀,所以動態注冊的這些接收者本身,最好定義為全局變量,然后在方法中初始化。查看全部
-
有序廣播的代碼和普通廣播差不多,不過sendOrderedBroadcast(intent2, null);后面null代表的是權限 在BC1和BC2中寫一個間的數據傳輸: BC1: Bundle bundle = new Bundle(); bundle.putString("test", "廣播處理的數據"); setResultExtras(bundle); BC2: Bundle bundle=getResultExtras(true);//接收數據 String s2=bundle.getString("test"); Log.i("info", "得到的處理結果是:"+s2);查看全部
-
//動態注冊優先于靜態注冊,但有局限性,必須要改程序啟動才有用 IntentFilter intentFilter=new IntentFilter("BC_ONE");//動態注冊所需的過濾器 BC2 bc2=new BC2();//動態注冊的對象 registerReceiver(bc2, intentFilter);//接收器的動態注冊查看全部
舉報
0/150
提交
取消