一、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,所以需要好好的練習,努力吧!