上篇博文講解了activity、content provider,此篇博文來仔細總結service、broadcast receiver;java
3. Serviceandroid
>什麼是服務?
>windows下服務: 沒有界面的長期後臺運行的程序。
>Android下服務: 是應用程序的一個組件,長期後臺運行的沒有界面的activitywindows
##服務兩種開啓方式
1.* startService() 開啓服務
>一旦服務開啓,服務就會長期的後臺運行,即便開啓者activity退出了,
>服務仍是在後臺繼續運行,直到用戶手工的中止服務爲止。
2.* bindService() 綁定服務
>若是開啓者activity退出了,服務也會跟着掛斷。
>解除綁定服務unbindService()
>服務只能夠被解綁一次,屢次解綁服務會拋異常
>服務應該只去綁定一次
##服務的生命週期
* 採用startService和stopService去開啓中止服務
>1. 服務只會被建立一次,若是服務已經被建立就不會從新執行onCreate方法了
>2. 服務只會被中止一次,若是服務已經中止就不會從新執行onDestroy方法
>3. 若是服務已經開啓,屢次調用startService方法,服務只會執行onstartCommand,onstart方法
* 採用bindService和unbindService開啓中止服務
>1.bindService() 若是服務不存在 oncreate -->onbind
>2. unbindService() onunbind-->ondestory();
>3. 綁定服務不會執行onstart和onstartcommand方法
>4. 服務只能夠被解綁一次。屢次解綁拋異常。
* 混合方式的開啓服務(複雜)
1. startservice 開啓服務 (保證服務長期後臺運行)
2. bindservice 綁定服務 (調用服務的方法)
3. unbindService 解除綁定服務 (中止調用服務的方法)
4. stopService 中止服務 (中止服務,播放器中止)
##爲何要引入bindService的API
>爲了可以調用服務裏面的方法app
##綁定服務調用服務方法的流程
1. 建立一個服務,在服務的內部有一個方法須要被調用。
public class LingdaoService extends Service
2. 在服務的內部建立一箇中間人 MyBinder 實現IBinder接口,繼承Binder類,中間人具備一個方法這個方法能夠間接調用服務內部的方法。
/**
* 中間人,在服務的內部
*/
public class MyBinder extends Binder{
/**
* 調用服務裏面的方法
* @param money 錢
*/
public void callMethodInService(int money){
if(money>2000){
methodInService();
}else{
Toast.makeText(LingdaoService.this, "太少了,你懂的", 1).show();
}
}
}
3. 實現服務的onBind方法。返回中間人對象。
public IBinder onBind(Intent intent) {
return new MyBinder();
}
4. 在activity裏面了,經過bindService的方法去綁定服務。
bindService(serivce, conn, BIND_AUTO_CREATE);
5. 若是服務成功被綁定了,執行onServiceConnected()方法,獲得中間人對象。
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyBinder) service;
System.out.println("在activity裏面獲取到了服務成功綁定返回的中間人ibinder");
}
6. 經過中間人對象間接的調用服務裏面的方法。
myBinder.callMethodInService(5000);ide
下面經過播放本地音樂的例子來說解服務:
佈局
首先建立一個項目工程文件,並佈局以下,將音樂文件添加到res目錄下面的raw文件下面:post
1.按照之前的思路,首先是佈局,在layout下面的activity.xml中的配置以下:this
<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" > <TextView android:id="@+id/tvinfo" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ListView android:id="@+id/lv" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
2.而後就是java代碼的書寫:spa
(1)首先寫bean類,建立一個MuscicInfo類,若是在企業項目或者大型項目中,須要序列化。xml
package com.xunfang.bean; public class MuscicInfo { private String name; private int id; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public MuscicInfo(String name, int id) { super(); this.name = name; this.id = id; } }
(2)書寫服務代碼就是中間人的代碼MusicService.java代碼以下:
package com.xunfang.musicservices; import java.util.List; import com.xunfang.bean.MuscicInfo; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.Binder; import android.os.IBinder; public class MusicService extends Service { private MediaPlayer mp; @Override public IBinder onBind(Intent intent) { return new MyMusicService(); } public class MyMusicService extends Binder{ public void playMusic(List<MuscicInfo> list,int postion){ play(list,postion); System.out.println("這裏已經訪問 了"); } public void stopMusic(){ stop(); } } //播放歌曲 public void play(List<MuscicInfo> list, int postion) { if(mp!=null){ //說明正在播放,而後中止播放 mp.stop(); //釋放資源 mp.release(); mp = null; } System.out.println("歌曲id是:"+list.get(postion).getId()); //實例化 mp= MediaPlayer.create(this, list.get(postion).getId()); //播放歌曲 mp.start(); } //中止歌曲 public void stop() { if(mp != null){ mp.stop() ; mp.release() ; mp = null ; } } }
(3)而後在MainActvity.java中實現對音樂的播放
package com.xunfang.music; import java.util.ArrayList; import java.util.List; import com.xunfang.bean.MuscicInfo; import com.xunfang.musicservices.MusicService; import com.xunfang.musicservices.MusicService.MyMusicService; import android.support.v7.app.ActionBarActivity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends ActionBarActivity { private TextView tv; private ListView lv; private List<MuscicInfo> list = new ArrayList<MuscicInfo>(); private Myconn conn; private MyMusicService mms; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tvinfo); lv = (ListView) findViewById(R.id.lv); list.add(new MuscicInfo("big", R.raw.big)); list.add(new MuscicInfo("冰雨", R.raw.by)); list.add(new MuscicInfo("光輝歲月", R.raw.ghsy)); lv.setAdapter(new MyAdapter()); Intent intent = new Intent(this,MusicService.class); conn = new Myconn(); bindService(intent, conn, BIND_AUTO_CREATE); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { tv.setText("正在播放的歌曲是:"+list.get(position).getName()); mms.playMusic(list, position); } }); } private class Myconn implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { mms = (MyMusicService) service; System.out.println("1234"); } @Override public void onServiceDisconnected(ComponentName name) { } } private class MyAdapter extends BaseAdapter{ @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView tv = new TextView(MainActivity.this); tv.setText(list.get(position).getName()); return tv; } } @Override protected void onDestroy() { super.onDestroy(); mms.stopMusic(); unbindService(conn); } }
java代碼在這塊已經書寫完畢,接下來就是在清單文件中配置服務,以下
<service
android:name="com.xunfang.musicservices.MusicService"
></service>
最後就是在模擬器或者真實機上面運行:
接下來最後一個組件broadcast receiver下篇博文總結。