转载

android四大组件学习总结以及各个组件示例(2)

上篇博文讲解了 activity、content provider,此篇博文来仔细总结 service、broadcast receiver;

3. Service

>什么是服务?
>windows下服务: 没有界面的长期后台运行的程序。
>Android下服务: 是应用程序的一个组件,长期后台运行的没有界面的activity

##服务两种开启方式
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
>为了能够调用服务里面的方法

##绑定服务调用服务方法的流程
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);

下面通过播放本地音乐的例子来讲解服务:

首先创建一个项目工程文件,并布局如下,将音乐文件添加到res目录下面的raw文件下面:

1.按照以前的思路,首先是布局,在layout下面的activity.xml中的配置如下:

<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代码的书写:

(1)首先写bean类,创建一个MuscicInfo类,如果在企业项目或者大型项目中,需要序列化。

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 下篇博文总结。

正文到此结束
Loading...