标签:android service 四大组件 service实例 onbindservice
上篇 学习了 Android的四大组件之一 BroadCastReceiver 的 相关知识
(1)Service 分类
(2)Service 的生命周期
(3)Service 标签 下的属性
(4)什么时候使用BindService 和 startService ?
(5)实例 - 通过Service 服务 实现 音乐播放器 后台播放
(1)本地服务
服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多。
缺点:主进程被Kill后,服务便会终止。
(2)远程服务 (一般为系统服务)
服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。
缺点:该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。
(1)前台服务
会在通知一栏显示 ONGOING 的 Notification,当服务被终止的时候,通知一栏的 Notification 也会消失,这样对于用户有一定的通知作用。常见的如音乐播放服务。
(2)后台服务
默认的服务即为后台服务,即不会在通知一栏显示 ONGOING 的 Notification。当服务被终止的时候,用户是看不到效果的。某些不需要运行或终止提示的服务,如天气更新,日期同步,邮件同步等。
(1)startService 启动的服务
主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService!
(2)bindService 启动的服务
该方法启动的服务要进行通信。停止服务使用unbindService
;
(3)startService 同时也 bindService 启动的服务
停止服务应同时使用stepService与unbindService
startService() : onCreate() -> onStart() -> onDestroy()
如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。下次调用者再起来仍然可以 stopService。
onBindService(): onCreate() -> onBind() -> onUnbind() -> onDestroy()
调用者退出了,Srevice就会调用onUnbind-->onDestroyed 所谓绑定在一起就共存亡了。
(1)android:name : 服务类名
(2)android:label : 服务的名字,如果此项不设置,那么默认显示的服务名则为类名
(3)android:icon :服务的图标
(4)android:permission : 申明此服务的权限,这意味着只有提供了该权限的应用才能控制或连接此服务
(5)android:process :表示该服务是否运行在另外一个进程,如果设置了此项,那么将会在包名后面加上这段字符串表示另一进程的名字
(6)android:enabled : 如果此项设置为 true,那么 Service 将会默认被系统启动,不设置默认此项为 false
(7)android:exported : 表示该服务是否能够被其他应用程序所控制或连接,不设置默认此项为 false
(1)启动一个后台服务长期进行某项任务那么使用 startService
(2)想要与正在运行的 Service 取得联系,使用 bindService
(3)等等
(1)startService() 实现
(2)onbindService() 实现
(3)一些优化:显示当前播放状态,存储播放状态配置(SharedPreference实现)
startService() 效果图: onbindService() 效果图:
package com.example.service; import com.example.servicedemo.R; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.Binder; import android.os.IBinder; import android.provider.MediaStore.Audio.Media; import android.util.Log; public class MusicService extends Service { private String TAG="MusicService"; private MediaPlayer player; @Override public void onCreate() { // 服务创建:可以做初始化 操作 Log.i(TAG, "onCreate"); //初始化 音乐播放 player=MediaPlayer.create(getApplicationContext(),R.raw.m123); //设置 无限循环 player.setLooping(true); super.onCreate(); } @Override public void onStart(Intent intent, int startId) { // 开启服务 Log.i(TAG, "onStart"); //播放 player.start(); super.onStart(intent, startId); } @Override public IBinder onBind(Intent intent) { //开启服务 //其他对象通过bindService 方法通知该Service时该方法被调用 Log.i(TAG, "onBind"); //返回 对象 return new mBind(); } @Override public void onDestroy() { //销毁时 Log.i(TAG, "onDestroy"); //停止 player.stop(); super.onDestroy(); } @Override public boolean onUnbind(Intent intent) { //其它对象通过unbindService方法通知该Service时该方法被调用 //解绑定操作 Log.i(TAG, "onUnbind"); //停止 return super.onUnbind(intent); } //用来返回 musicservice 对象 //start() 是没办法 返回 服务对象的 //binder 可以返回 bind对象 public class mBind extends Binder{ public MusicService getService(){ return MusicService.this; } } //binder 播放音乐 public void playMusic(){ player.start(); } //binder 停止音乐 public void stopMusic(){ player.stop(); } //当然 还可以添加 其余操作 }
<service android:name="com.example.service.MusicService" ></service>
package com.example.servicedemo; import android.app.Activity; import android.app.Service; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.graphics.Color; import android.os.Bundle; import android.os.IBinder; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import com.example.service.MusicService; import com.example.service.MusicService.mBind; public class MainActivity extends Activity implements OnClickListener { // 音乐播放服务 private MusicService musicService; /** * 通过SerciceConnection 对象 的相关 方法可以得到 更多的Service对象 */ private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // 当启动源跟 Service 的 连接 以外的丢失的时候,会调用这个方法:比如Service被杀死了 } @Override public void onServiceConnected(ComponentName name, IBinder service) { // 当启动源跟 Service 成功 连接之后会 自动调用这个方法 musicService = ((mBind) service).getService(); } }; private TextView textview1; private Button button1, button2, button3, button4, button5, button6; private SharedPreferences shared; private final String PLAYMUSIC = "音乐状态:音乐播放中。。。。。。。。"; private final String STOPMUSIC = "音乐状态:播放停止"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 使用SharedPreferences 保存 音乐的状态 shared = this.getSharedPreferences("music", 10); // 显示 当前 音乐状态 textview1 = (TextView) findViewById(R.id.textView1); button1 = (Button) findViewById(R.id.button1); button2 = (Button) findViewById(R.id.button2); button3 = (Button) findViewById(R.id.button3); button4 = (Button) findViewById(R.id.button4); button5 = (Button) findViewById(R.id.button5); button6 = (Button) findViewById(R.id.button6); button1.setOnClickListener(this); button2.setOnClickListener(this); button3.setOnClickListener(this); button4.setOnClickListener(this); button5.setOnClickListener(this); button6.setOnClickListener(this); // 加载状态 文件 配置 String mState = shared.getString("mState", null); int mColor = shared.getInt("mColor", 0); if (mState != null) { if (mColor > 0) { textview1.setTextColor(Color.RED); } else { textview1.setTextColor(Color.BLUE); } textview1.setText(mState); } } /** * 按钮点击事件 */ @Override public void onClick(View v) { // 根据id 点击 // 根据Intent 来开启 Service Intent intent = new Intent(MainActivity.this, MusicService.class); switch (v.getId()) { case R.id.button1: // onStart 方式 开启 音乐服务:播放音乐 startService(intent); // 音乐状态 playMusicState(); break; case R.id.button2: // onStart 方式 关闭 音乐服务:关闭音乐播放 stopService(intent); // 音乐状态 stopMusicState(); break; case R.id.button3: // onBind 方式 开启 音乐服务:播放音乐 bindService(intent, conn, Service.BIND_AUTO_CREATE); textview1.setText("onBind() 成功"); break; case R.id.button4: // onBind 方式 关闭 音乐服务:关闭音乐播放 unbindService(conn); textview1.setText("unBind() 成功"); break; case R.id.button5: //播放音乐 musicService.playMusic(); // 音乐状态 playMusicState(); break; case R.id.button6: //停止 musicService.stopMusic(); // 音乐状态 stopMusicState(); break; } } /** * 存入本地,状态配置 * * @param content * @param color */ private void EditMusicState(String content, int color) { Editor editor = shared.edit(); // 状态 editor.putString("mState", content); // 文字颜色 0 蓝色 ; 1 红色; editor.putInt("mColor", color); // 提交 editor.commit(); } /** * 音乐播放状态 */ private void playMusicState() { textview1.setTextColor(Color.BLUE); textview1.setText(PLAYMUSIC); EditMusicState(PLAYMUSIC, 0); } /** * 音乐停止状态 */ private void stopMusicState() { textview1.setTextColor(Color.RED); textview1.setText(STOPMUSIC); EditMusicState(STOPMUSIC, 1); } }
http://download.csdn.net/detail/lablenet/9059911
不知不觉已经很晚了,也该睡觉了,Service 晚安!
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)
标签:android service 四大组件 service实例 onbindservice
原文地址:http://blog.csdn.net/lablenet/article/details/48073093