Android:Service通知Activity更新界面


Android有四大組件,其中包括service和activity,那么在使用的過程中,我們最常遇到的問題是他們之間的通信問題。

1.首先Activity調用Service

這個是比較基礎的,它有兩種常見的方法;

1. 通過Intent

可以指定package name和class name的方式來調用,Intent.setClassName這個成員即可。通過putString來裝載數據,startService(intent)即可例子如下:

Intent regIntent = new Intent(“com.service”);
regIntent.putExtra(“data”, "helloData");
startService(regIntent);

2.通過IPC

IPC有點復雜,想要了解的可以去查有關IBinder的一些資料。

2.Service將狀態告訴Activity

方法有兩種

1.service 通過廣播的形式發送broadcast

我們寫一個broadcastReceiver即可,通常的情況,將broadcastReceiver寫成Activity的內部類,這個onReceiver可以直接調用activity的方法來更新界面。但是內部類只能采用代碼注冊的方法registerReceiver(),不能再AndroidManifest.xml文件中進行靜態的聲明,因為內部類要依賴於外部類而存在的。如果你一定要用AndroidManifest來注冊receiver,那么只能把broadcastReceiver寫成單獨的文件的public類。這時候,你想更新界面就比較麻煩了,你只能自己把你要更新的activity運行起來,然后再向這個activity的內部類發廣播的消息來更新界面

2.service直接向activity發intent

在service里面進行startActivity是屬於在Activity外startActivity即在task外啟動activity,因此,必須在intent加入一個參數如下:

Intent intentSend = new Intent(Constants.ACTION_STATUS);

intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent1.putExtra(“statues“,“end“);

context.startActivity(intent1);

但是此時會引發的一個問題是,多次startActivity會導致很多的activity實現被運行,這肯定不是我們要的,我只要一個Activity就可,此時,我們要在androidManifest里面對這個activity的launchMode設置為singleInstance

<activity android:name="com.demo.Activity"
android:label="@string/online" android:launchMode="singleInstance">

記住啦,有人設置為singleTask,也可以,但他們有一點區別。

同時記住要更新intent,這樣getInstent才可以得到每次的新實例

@Override

protected void onNewIntent (Intent intent){

    setIntent(intent);

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM