android四大組件學習總結以及各個組件示例(2)

上篇博文講解了activity、content provider,此篇博文來仔細總結service、broadcast receiver;java

3. Serviceandroid

>什麼是服務?
>windows下服務: 沒有界面的長期後臺運行的程序。
>Android下服務: 是應用程序的一個組件,長期後臺運行的沒有界面的activity
windows

##服務兩種開啓方式
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下篇博文總結。

相關文章
相關標籤/搜索