Service的生命周期與開啟Activity的通信

一、Android的五個進程:

  1. ActivityProcess: 前臺進程跛蛋,Activity
  • VisibleProcess:可見進程,進程擁有暫停狀態(tài)的Activity
  • StartedServiceProcess:服務(wù)進程拣播,包含正在運行的Service
  • BackgroundProcess:后臺進行途茫,處于停止?fàn)顟B(tài)的Activity
  • EmptyProcess:被關(guān)閉的Activity:空進程,系統(tǒng)會保留啟動Activity信息的圆,殘留信息鼓拧;

二、啟動Serivice的生命周期:

onCreate()-->onStartCommand()-->onStart()(2.0以后已經(jīng)被onStartCommand()的代替)-->onDestroy()

效果圖:
啟動service的生命周期.jpg

三越妈、綁定Service的生命周期:

onCreate()-->onBind()-->onUnBind()-->onDestroy()

效果圖:
綁定service生命周期.jpg

四季俩、啟動綁定service生命周期:

1、先啟動service梅掠,再 綁定service酌住,再解綁service

onCreate()-->onStartCommand()-->onBind()-->onUnbind()

效果圖:
先啟動再綁定最后解綁.jpg
2、將啟動的service阎抒,綁定之后酪我,如果想銷毀service,必須先解綁才能停止service

onCreate()-->onStartCommand-->onBind()-->onUnbind-->onDestroy()

效果圖:
銷毀先啟動再綁定的Service.jpg
3且叁、先啟動都哭,再綁定,解綁逞带,再次綁定质涛,將onUnbind()方法返回true,才能執(zhí)行onRebind()方法
@Override
    public boolean onUnbind(Intent intent) {
        Log.i("dayang","-------------onUnbind---------------");
        return true;
    }

onCreate()-->onStartCommand()-->onBind()-->onUnbind()-->onRebind()-->onUnbind()-->onDestroy()

效果圖:
解綁之后再次綁定.jpg

五掰担、Activity與綁定的Service的通信:

通過ServiceConnection接口和IBinder接口實現(xiàn)通信汇陆;

  • 在Activity中綁定Service時,會創(chuàng)建ServiceConnection接口對象带饱,重寫onServiceConnected()方法毡代,該方法有Service綁定成功時onBind()方法返回的IBinder接口對象阅羹;
  • 在Service的執(zhí)行的onBind()方法返回IBinder接口對象;

對于Ibinder接口Android給出了實現(xiàn)類Binder教寂,我們只需要繼承這個Binder類捏鱼,就可以實現(xiàn)IBinder接口并寫自己的邏輯代碼

Activity 通過ServiceConnection接口取得與之綁定Service返回的IBinder接口對象

MyService的代碼
public class MyService extends Service {
    public class MyBinder extends Binder{
        int count=0;

        public int getCount() {
            return ++count;
        }
    }
    public MyService() {
    }
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("dayang","-------------onBind-----------------");
        return new MyBinder();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("dayang","-------------onStartCommand---------------");
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
    }
    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
        Log.i("dayang","-------------onRebind---------------");
    }
    @Override
    public boolean onUnbind(Intent intent) {
        Log.i("dayang","-------------onUnbind---------------");
        return true;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("dayang","-------------onCreate---------------");
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i("dayang","-------------onDestroy---------------");
    }
}
綁定MyService的Actvity的代碼
public class MainActivity extends AppCompatActivity {
    MyService.MyBinder myBinder=null;
    ServiceConnection mConn=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            myBinder= (MyService.MyBinder) iBinder;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void startActivity(View view){
        Intent intent=new Intent(this,MyService.class);
        startService(intent);
    }
    public void stopActivity(View view){
        Intent intent=new Intent(this,MyService.class);
        stopService(intent);
    }
    public void bindService(View view){
        if(myBinder==null){
            Intent intent=new Intent(this,MyService.class);
            bindService(intent,mConn, Context.BIND_AUTO_CREATE);
        }else{
            Log.i("dayang",myBinder.getCount()+"得到次數(shù)-----");
        }
    }
    public void unBindSerivce(View view){
        Intent intent=new Intent(this,MyService.class);
        unbindService(mConn);
    }
}

綁定MyService的Actvity的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="cn.ucai.day17_12_20_service.MainActivity">
    <Button
        android:onClick="startActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="startActivty" />
    <Button
        android:onClick="stopActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="stopActivity"
        />
    <Button
        android:onClick="bindService"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="bindService"
        />
    <Button
        android:onClick="unBindSerivce"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="unBindService"
        />
</LinearLayout>

六、在Service中啟動Activity

因為Service運行時沒有任務(wù)棧酪耕,要為開啟的Activity指定一個新的任務(wù)棧:

1导梆、在Activity中,啟動一個Service并發(fā)送消息
Intent intent=new Intent(this,MyService.class);
intent.putExtra("flag",true);
startService(intent);
2迂烁、啟動Service之后看尼,執(zhí)行onStartCommand(),在該方法開啟一個新的Activity

給新的Activity一個任務(wù)棧

  @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        boolean flag=intent.getBooleanExtra("flag",false);
        if(flag){
            Intent intent2=new Intent(this,Main2Activity.class);
            intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent2);
        }
        return super.onStartCommand(intent, flags, startId);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盟步,一起剝皮案震驚了整個濱河市藏斩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌却盘,老刑警劉巖狰域,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異黄橘,居然都是意外死亡兆览,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門塞关,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抬探,“玉大人,你說我怎么就攤上這事描孟∈荒溃” “怎么了砰左?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵匿醒,是天一觀的道長。 經(jīng)常有香客問我缠导,道長廉羔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任僻造,我火速辦了婚禮憋他,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘髓削。我一直安慰自己竹挡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布立膛。 她就那樣靜靜地躺著揪罕,像睡著了一般梯码。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上好啰,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天轩娶,我揣著相機與錄音,去河邊找鬼框往。 笑死鳄抒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的椰弊。 我是一名探鬼主播许溅,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼男应!你這毒婦竟也來了闹司?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沐飘,失蹤者是張志新(化名)和其女友劉穎游桩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耐朴,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡借卧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筛峭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铐刘。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖影晓,靈堂內(nèi)的尸體忽然破棺而出镰吵,到底是詐尸還是另有隱情,我是刑警寧澤挂签,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布疤祭,位于F島的核電站,受9級特大地震影響饵婆,放射性物質(zhì)發(fā)生泄漏勺馆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一侨核、第九天 我趴在偏房一處隱蔽的房頂上張望草穆。 院中可真熱鬧,春花似錦搓译、人聲如沸悲柱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豌鸡。三九已至跑芳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間直颅,已是汗流浹背博个。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留功偿,地道東北人盆佣。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像械荷,于是被迫代替她去往敵國和親共耍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概述 Service是一個可以在后臺執(zhí)行長時間運行操作而不使用用戶界面的應(yīng)用組件。 服務(wù)可由其他應(yīng)用組件啟動颤诀,且即...
    daking閱讀 4,519評論 0 12
  • Service是Android四大組件中與Activity最相似的組件字旭,他們都代表可執(zhí)行的程序,Service與A...
    AndYMJ閱讀 1,806評論 0 3
  • 前言:本文所寫的是博主的個人見解崖叫,如有錯誤或者不恰當(dāng)之處遗淳,歡迎私信博主,加以改正心傀!原文鏈接屈暗,demo鏈接 Serv...
    PassersHowe閱讀 1,415評論 0 5
  • 1 每周一都是開始也是最忙的一天养叛,很多例會都在這一天,因此這一天也是非常充實的一天宰翅。今天對我來說是最近一段時間唯一...
    田田拾光閱讀 1,036評論 5 5
  • 今天是第一次看《這個殺手不太冷》這部電影弃甥。以前聽說過很多次,但是今天是第一次看堕油。我覺得一部好電影和其他電影的區(qū)別就...
    斯圖若彩虹_閱讀 388評論 0 0