安卓第四周Service,Broadcast Receiver,Widget,Webview

無聊的前言:

  • 又是堅苦卓絕的一週,我這種人又想放棄了,真是無語。以前看了視頻還覺得挺簡單,週五也作了一點點,自信滿滿留到週日下午完成。因而週六和朋友出去,聊了國家和民族在社會主義初級階段的矛盾(6不6),以及自身的發展問題,有點無奈,感受本身人生選擇變少了,眼界窄的可怕。。。而後週日下午開始寫做業,結果各類BUG。因而又想放棄,結果老師一眼看出缺個非空判斷語句,這種問題也是能搞死人的。。。下週晚上不能玩了,要看文檔了html

Service:服務,能夠實現好比音樂播放之類的後臺功能

  • 首先繼承
    public class MusicService extends Serviceandroid

  • 在ManiFest.xml中添加申明
    <service android:name=".MusicService"/>app

  • 接着在res中添加raw文件夾,用於存放音頻文件(英文小寫)ide

  • 服務啓動方法有二:函數

  • 1.start啓動方式
    1佈局

    @Override
       public void onCreate() {
       super.onCreate();
       mMediaPlayer = MediaPlayer.create(this,R.raw.libai);
       }

    2測試

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

    3ui

    @Override
       public void onDestroy() {
       mMediaPlayer.stop();
       super.onDestroy();
       }
  • 大體生命週期:onCreate()->onStartCommand->onDestroy()this

  • 2.bind方式(比做橋樑)
    1.Service中新建內部類,返回MusicService給Activity中的ServiceConnection.net

    public class LocalBinder extends Binder {
       MusicService getService(){
           return MusicService.this;
       }
       }

    2.暫存Binder中,Binder實現了IBinder接口,故實例化IBinder對象來綁定service

    private IBinder mIBinder = new LocalBinder();

    3.在Service類的默認方法中獲得IBinder對象

    @Nullable
       @Override
       public IBinder onBind(Intent intent) {
           return mIBinder;
       }

    4.此處傳入一個mServiceConnection

    bindService(new Intent(MainActivity.this, MusicService.class), mServiceConnection, BIND_AUTO_CREATE);

    5.寫一個鏈接帶兩個方法(有點繞)

    private ServiceConnection mServiceConnection = new ServiceConnection() {
       private MusicService mMusicService;
       @Override
       public void onServiceConnected(ComponentName name, IBinder service) {
           MusicService.LocalBinder localBinder= (MusicService.LocalBinder) service;
           mMusicService = localBinder.getService();
       }
       @Override
       public void onServiceDisconnected(ComponentName name) {
       }
       };

    6.最後unbindService

    unbindService(mServiceConnection);

Broadcast Receiver廣播接收器

一、四大組件之一:廣播(通知消息)接收器 –要想到在Manifest中註冊
二、系統使用了不少廣播:通知時間改變(鬧鐘纔會響)、電池電量變低、拍攝了照片、改變了語言
三、沒有用戶界面。
四、只負責向全部在Manifest裏的註冊者發送廣播,須要這個廣播的人去接收它。

  • BroadcastReceiver的兩種註冊方式:

  • 1.靜態註冊

    <receiver android:name=".TestBroadcastReceiver">
           <intent-filter>
               <action android:name="com.example.test.broadcast"/>
           </intent-filter>
        </receiver>
  • 2.動態註冊,在onStart方法中註冊,在onStop方法中反註冊

    @Override
    protected void onStart() {
       super.onStart();
    
       /* 動態註冊廣播*/
       //根據action裏的android:name過濾廣播。
       IntentFilter intentFilter = new IntentFilter();
       intentFilter.addAction(COM_EXAMPLE_TEST_BROADCAST);
       registerReceiver(mTestBroadcastReceiver, intentFilter);
     }
    
     @Override
     protected void onStop() {
        super.onStop();
       unregisterReceiver(mTestBroadcastReceiver);
     }
  • 二者的區別:靜態註冊的廣播一直有效,動態註冊的廣播須要反註冊掉,否則註冊在內存裏,會不斷的消耗內存,因此經常使用動態註冊。

如何接受廣播 onReceive方法

  • MainActivity類

    @Override
       public void onClick(View view) {
           /* 發送廣播 */
           Intent intent = new Intent(MainActivity.this,TestBroadcastReceiver.class);
           //只發給action爲COM_EXAMPLE_TEST_BROADCAST
           intent.setAction(COM_EXAMPLE_TEST_BROADCAST);
           intent.putExtra("toast", "this is a toast of broadcast");
           sendBroadcast(intent);
       }
  • BroadcastReceiver類

    public class TestBroadcastReceiver extends BroadcastReceiver {
       /*    接收廣播、處理數據   */
       @Override
       public void onReceive(Context context, Intent intent) {
           if (intent != null){
               //判斷字符串是否相等TextUtils.equals().
               if (TextUtils.equals(intent.getAction(),MainActivity.COM_EXAMPLE_TEST_BROADCAST)){
                   String toastString = intent.getStringExtra("toast");
                   Toast.makeText(context,toastString,Toast.LENGTH_SHORT).show();
               }
           }
       }
       }
  • BroadcastReceiver的生命週期:Register – SendBroadcast – onReceive – unRegister

Widget安卓桌面顯示插件

  • http://blog.csdn.net/harvic880925/article/details/41445407

  • 如下內容基本摘抄自上面這個博客,由於寫的很好且詳細,因此推薦直接看這個,本身這裏只介紹一部份內容

  • App Widget是應用程序窗口小部件(Widget)是微型的應用程序視圖,它能夠被嵌入到其它應用程序中(好比桌面)並接收週期性的更新。你能夠經過一個App Widget Provider來發佈一個Widget。官方文檔地址:http://developer.android.com/guide/topics/appwidgets/index.html
    這裏涉及到兩個方面的內容:AppWidgetProvider類和appwidget-provider標籤;

  • 一、appwidget-provider標籤:定義桌面widget的大小,初始狀態等等信息

    android:minWidth : 最小寬度
    android:minHeight : 最小高度
    android:updatePeriodMillis : 更新widget的時間間隔(ms),"86400000"爲1個小時
    android:previewImage : 預覽圖片
    android:initialLayout : 加載到桌面時對應的佈局文件
    android:resizeMode : widget能夠被拉伸的方向。horizontal表示能夠水平拉伸,vertical表示能夠豎直拉伸
    android:widgetCategory : widget能夠被顯示的位置。home_screen表示能夠將widget添加到桌面,keyguard表示widget能夠被添加到鎖屏界面。
    android:initialKeyguardLayout : 加載到鎖屏界面時對應的佈局文件
  • 二、AppWidgetProvider類:

上面咱們經過appwidget-provider標籤就能夠獲得初始化的佈局,視圖等,但咱們的widget要實時更新怎麼辦,要響應用戶操做怎麼辦,這就須要額外的類來輔助處理了,這個類就是AppWidgetProvider。

因爲AppWidgetProvider要接收到當前widget的狀態(是否被添加,是否被刪除等),因此要接收通知,必然是派生自BroadcastReceiver。

AppWidgetProvider中的廣播處理函數以下:(根據不一樣的使用狀況,重寫不一樣的函數)

onUpdate():

在3種狀況下會調用OnUpdate()。onUpdate()是在main線程中進行,所以若是處理須要花費時間多於10秒,處理應在service中完成。(第二篇會講爲何還要有service)
(1)在時間間隔到時調用,時間間隔在widget定義的android:updatePeriodMillis中設置;
(2)用戶拖拽到主頁,widget實例生成。不管有沒有設置Configure activity,咱們在Android4.4的測試中,當用戶拖拽圖片至主頁時,widget實例生成,會觸發onUpdate(),而後再顯示activity(若是有)。這點和資料說的不同,資料認爲若是設置了Configure acitivity,就不會在一開始調用onUpdate(),而實驗顯示當實例生成(包括建立和重啓時恢復),都會先調用onUpate()。在本例,因爲此時在preference還沒有有相關數據,建立實例時不能有效進行數據設置。
(3)機器重啓,實例在主頁上顯示,會再次調用onUpdate()

onDeleted(Context, int[]):

當 widget 被刪除時被觸發。

onEnabled(Context):

當第1個 widget 的實例被建立時觸發。也就是說,若是用戶對同一個 widget 增長了兩次(兩個實例),那麼onEnabled()只會在第一次增長widget時觸發。

onDisabled(Context):

當最後1個 widget 的實例被刪除時觸發。

onReceive(Context, Intent):

在接收到廣播時,調用。

Webview

  • 網頁顯示器,顯示網頁、解析網頁、加載網頁。

參考:
http://blog.csdn.net/sinat_16640839/article/details/50976429
http://blog.csdn.net/harvic880925/article/details/41445407

相關文章
相關標籤/搜索