Android學習第四周_服務、廣播和酷特性

一、service的用法

1.service的概念
Service是一個可以在後臺長時間的操作,默默地爲其他應用服務的不提供界面的Android組件。
2、基本使用
(1)啓動服務的方法

  • startService
  • bindService

(2)代碼描述
首先新建一個ServiceDemo的java程序並繼承於Service,然後在ServiceDemo中重寫Service中的方法,代碼如下:

“`
public class ServiceDemo extends Service{

@Override
public void onCreate() {
    super.onCreate();
    Log.i(TAG,"onCreate");
    mMediaPlayer = MediaPlayer.create(this,R.raw.faded);

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG,"onStartCommand");
    mMediaPlayer.start();
    return START_NOT_STICKY;
}

@Override
public void onDestroy() {
    mMediaPlayer.stop();
    super.onDestroy();
    Log.i(TAG,"onDestroy");
}

public class LocalBinder extends Binder{

    MusicService getService(){
        return MusicService.this;
    }
}

}
在程序中,主要是重寫onCreate、onStartCommand和onDestroy方法,然後在這其中添加相應的邏輯代碼。

(3)Service的生命週期
這裏寫圖片描述

通過這個圖可以看到,兩種啓動service的方式以及他們的生命週期,bind service的不同之處在於當綁定的組件銷燬後,對應的service也就被kill了。service的聲明週期相比與activity的簡單了許多,只要好好理解兩種啓動service方式的異同就行。
關於生命週期,比較簡單的流程圖如下:
這裏寫圖片描述
(4)另一個service–IntetService

IntentService使用隊列的方式將請求的Intent加入隊列,然後開啓一個worker thread(線程)來處理隊列中的Intent,對於異步的startService請求,IntentService會處理完成一個之後再處理第二個,每一個請求都會在一個單獨的worker thread中處理,不會阻塞應用程序的主線程,這裏就給我們提供了一個思路,如果有耗時的操作與其在Service裏面開啓新線程還不如使用IntentService來處理耗時操作。而在一般的繼承Service裏面如果要進行耗時操作就必須另開線程,但是使用IntentService就可以直接在裏面進行耗時操作,因爲默認實現了一個worker thread。對於異步的startService請求,IntentService會處理完成一個之後再處理第二個。

二、BroadcastReceiver

1、概述
廣播接收者( BroadcastReceiver )用於接收廣播 Intent ,廣播 Intent 的發送是通過調用 Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 來實現的。通常一個廣播 Intent 可以被訂閱了此 Intent 的多個廣播接收者所接收。
2、兩者註冊方式
第一種——動態註冊:

public class MyBroadcastReceiver extends BroadcastReceiver {

// action 名稱
String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED" ;

public void onReceive(Context context, Intent intent) {

   if (intent.getAction().equals( SMS_RECEIVED )) {
       // 相關處理 : 地域變換、電量不足、來電來信;
   }
}

}
第二種——系統註冊:

< receiver android:name = “.MyBroadcastReceiver” >
< intent-filter android:priority = “1000” >

< action android:name = ” android.provider.Telephony.SMS_RECEIVED” />

當然了需要權限 :

< uses-permission android:name = “android.permission.RECEIVE_SMS” />
< uses-permission android:name = “android.permission.SEND_SMS” />

三、WebView

1、概述
WebView(網絡視圖)能加載顯示網頁,可以將其視爲一個瀏覽器,它使用了WebKit渲染引擎加載顯示網頁。
2、使用步驟
(1)在要Activity中實例化WebView組件:WebView webView = new WebView(this);
(2)調用WebView的loadUrl()方法,設置WevView要顯示的網頁:
互聯網用:webView.loadUrl(“http://www.baidu.com“);
本地文件用:webView.loadUrl(“file:///android_asset/XX.html”); 本地文件存放在:assets 文件中
(3)調用Activity的setContentView( )方法來顯示網頁視圖
(4)用WebView點鏈接看了很多頁以後爲了讓WebView支持回退功能,需要覆蓋覆蓋Activity類的onKeyDown()方法,如果不做任何處理,點擊系統回退剪鍵,整個瀏覽器會調用finish()而結束自身,而不是回退到上一頁面
(5)需要在AndroidManifest.xml文件中添加權限,否則會出現Web page not available錯誤。
<uses-permission android:name="android.permission.INTERNET" />
3、方法重寫
(1)Url覆蓋

        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            //是不是重新加載(攔截界面)
            //404頁面
            if(url.contains("404")){
                view.loadUrl("http://www.zhihu.com");
            }
            return super.shouldOverrideUrlLoading(view, url);
        }

(2)設置loading界面

public void onPageStarted(WebView view, String url, Bitmap favicon) {
            //頁面開始加載,可以設置其loading界面
            super.onPageStarted(view, url, favicon);
        }

(3)關閉loading

   public void onPageFinished(WebView view, String url) {
            //頁面加載結束,關閉loading界面
            super.onPageFinished(view, url);
        }

(4)Url替換

    public void onLoadResource(WebView view, String url) {
            //url替換,爲了節省流量,盜用人家的logo
            if(url.contains("logo.img")){
            }

(5)網頁請求響應

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            //攔截請求  ,url是打開一個連接  而請求是客戶端發送信息給服務器
            //hybrid離線網頁
            return super.shouldInterceptRequest(view, request);
        }

由於webview中有很多的重寫方法,所以上面的知識其中的一部分,更多的還需要自己去查找Webview的源碼。

四、Widget

1、概念
widget就是桌面部件,是android中獨有的功能。
2、註冊

<receiver android:name=".MusicWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@layout/widget_setting"/>
</receiver>

3、編寫代碼,代碼也是繼續於AppWidgetProvider,一般情況下,會重現下面的幾種方法:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    pushUpdate(context,appWidgetManager,"",false);
}

@Override
public void onDeleted(Context context, int[] appWidgetIds) {
    super.onDeleted(context, appWidgetIds);
}

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
}

@Override
public void onDisabled(Context context) {
    super.onDisabled(context);
}

五、總結

本週學習的內容比較多,也比較的有趣,可以做出很多有趣的Demo,所以需要好好的練習,努力吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章