中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【三】7認識 Android Service

發布時間:2020-07-28 18:01:19 來源:網絡 閱讀:765 作者:Sesedese 欄目:移動開發

【一】使用Service


這節課程內容包括:使用Service、綁定Service、Service的生命周期


Activity能夠呈現用戶界面,與用戶進行交互,

而很多時候,我們程序不需要與用戶交互,只需要一直在后臺運行,

做一些事物處理,例如:Socket長連接、Http網絡通信、與服務器保持推送的連接。


如何創建Service?

建一個繼承于Service的子類,然后在AndroidManifest.xml中配置即可。

public class MyService extends Service{
    public IBinder onBind(Intent intent){
        throw new UnsupportOperationException("Not yet implemented");
    }
}


<Service
    android:name=".MyService"
    android:enabled="true"
    android:exported="Service"
>
</Service>
  • android:exported —— 是否向外界公開

  • android:enabled —— 是否啟用


如何啟動Service?

新建一個Button,在MainActivity中給它設置一個事件監聽器,然后

startService(new Intent(MainActivity.this,MyService.class));

這樣就能啟動服務,接下來建一個停止服務的Button,寫上

stopService(new Intent(MainActivity.this,MyService.class))

疑問:啟動和停止都創建了一個Intent,這兩個新創建的Intent實例,是否操作是同一個服務呢?

回答:是同一個服務。因為服務的實例,在操作系統上,只可能有那么一個。

把Intent定義為成員變量,startService和stopService都傳入這同一個Intent,效果還是一樣的,

因為Intent只是用來配置程序要啟動Service的信息的,具體所要操作的Service還是同一個Service。


在"系統設置"-"應用"-"運行中"就可以看我們寫的服務是否啟動。


現在補充一下,讓我們的Service在后臺不斷執行輸出語句,

這需要重寫onStartCommand方法:

public class MyService extends Service{

    public IBinder onBind(Intent intent){
        throw new UnsupportOperationException("Not yet implemented");
    }
    
    @Override
    public int onStartCommand(Intent intent,int flags,int startId){
    
        new Thread(){
            public void run(){
                super.run();
                while(true){
                    System.out.println("服務正在運行");
                }
                try{
                    sleep(100);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
            }
        }.start();
    
    
        return super.onStartCommand(intent,flag,startId);
    }
}

這樣,如果啟動了服務,就算Activity已經退出,它仍然會在后臺執行。


【二】綁定Service


啟動Service還能用綁定Service的方式來啟動,如何綁定?

在MainActivity加兩個Button,一個"BindService",一個"UnBindService"。

它們觸發的方法分別是bindService()和unbindService()。


bindService()有三個參數,Intent、服務的連接(用于監聽服務的狀態,這里傳入)、傳一個常量Context.BIND_AUTO_CREATE。

第二個參數需要MainActivity實現ServiceConnection接口,需要實現重寫以下的方法:

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
    Toast.makeText(MainActivity.this, "onServiceConnected", Toast.LENGTH_SHORT).show();
}

@Override
public void onServiceDisconnected(ComponentName name) {

}

onServiceConnected在服務被綁定成功時執行,

onServiceDisconnected在服務所在進行崩潰或被殺掉時被執行。


unbindService()的參數就是this。


接下來執行程序,會發現出錯:

java.lang.RuntimeException: Unable to bind to service com.linww.demo.learnservice.MyService@23e111e3 with Intent { cmp=com.linww.demo.learnservice/.MyService }: java.lang.UnsupportedOperationException: Not yet implemented


通過查看發現是onBind這里拋異常,在這方法返回一個Binder()對象就OK了。

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
   // throw new UnsupportedOperationException("Not yet implemented");
    return new Binder();
}


【三】Service的生命周期


服務生命周期只需要記得有 onCreate()和onDestroy()。


規律:同時啟動服務并且綁定服務,必須同時停止和解除綁定,服務才能被停止。


如果Activity與某一個Service綁定,那么退出這個Activity,Service也會被取消綁定。


關于onStartCommand()方法,如果Service第一次啟動,是onCreate()后執行onStartCommand();

而如果Service已經被啟動過了,那么再去啟動它,例如點擊啟動按鈕,

則只會執行onStartCommand(),不會重復執行onCreate()。









向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁南县| 荔波县| 阳朔县| 枣阳市| 广西| 郁南县| 衢州市| 温泉县| 宜丰县| 苏尼特右旗| 定结县| 平邑县| 澄江县| 云和县| 石嘴山市| 沭阳县| 襄城县| 西城区| 香河县| 三门峡市| 昂仁县| 万荣县| 辽中县| 昌都县| 盈江县| 合川市| 龙海市| 昌江| 峨眉山市| 万盛区| 抚宁县| 云林县| 新兴县| 曲沃县| 乐东| 长垣县| 通榆县| 长泰县| 昆明市| 嘉善县| 甘洛县|