Service几种情况介绍和使用
来源:互联网 发布:淘宝开学季活动 编辑:程序博客网 时间:2024/05/17 04:03
普通Service 后来运行执行普通操作
如果需要执行耗时操作必须开启线程
IntentService 自带线程可以执行耗时操作,不需开启线程
普通Service
1.startService()
2.stopService()
Service先执行onCreate方法 在执行onstartCommand 方法
如果执行stopService() Service 会执行 onDestory()
onStartCommand()方法必须返回一个整数,这个整数是一个描述了在系统的杀死事件中,系统应该如何继续这个服务的值
START_NOT_STICKY
如果系统在onStartCommand()方法返回之后杀死这个服务,那么直到接受到新的Intent对象,这个服务才会被重新创建。这是最安全的选项,用来避免在不需要的时候运行你的服务。
START_STICKY
如果系统在onStartCommand()返回后杀死了这个服务,系统就会重新创建这个服务并且调用onStartCommand()方法,但是它不会重新传递最后的Intent对象,系统会用一个null的Intent对象来调用onStartCommand()方法,在这个情况下,除非有一些被发送的Intent对象在等待启动服务。这适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来。
START_REDELIVER_INTENT
如果系统在onStartCommand()方法返回后,系统就会重新创建了这个服务,并且用发送给这个服务的最后的Intent对象调用了onStartCommand()方法。任意等待中的Intent对象会依次被发送。这适用于那些应该立即恢复正在执行的工作的服务,如下载文件
Intent intent = new Intent(this, MusicService.class); intent.putExtra("action", "play"); startService(intent);
package example.li_yuweii.servicedemmo.service;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.net.Uri;import android.os.IBinder;import android.support.annotation.Nullable;import android.util.Log;import java.io.IOException;import example.li_yuweii.servicedemmo.R;/** * Created by li-yuweii on 16-9-21. */public class MusicService extends Service { private MediaPlayer player; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); //使用音乐资源来创建MediaPlayer,可以直接播放// player = MediaPlayer.create(this, R.raw.nobody); player = new MediaPlayer(); //设置远程,文件网址 try { player.setDataSource(this, Uri.parse("http://10.0.153.160:8080/nobody.mp3")); //设置准备歌曲资源,开启线程,加载网络数据 player.prepareAsync();// player.setOnPreparedListener(); } catch (IOException e) { e.printStackTrace(); } } /** * 服务启动的时候,调用startService()的时候,都会调用这个方法 * 可以认为这个方法就是来接收其他组件传递的参数 * @param intent 是startService()中的参数 * @param flags * @param startId * @return int 返回值能够控制服务是否自动复活,在程序意外终止的情况下 */ @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("MusicService", "onStartCommand: "); if (intent != null) { String action = intent.getStringExtra("action"); if ("play".equals(action)) { player.start(); } else if ("pause".equals(action)) { player.pause(); } } return START_REDELIVER_INTENT; //模式 } @Override public void onDestroy() { Log.d("MusicService", "onDestroy: "); //释放各种资源 if (player.isPlaying()) { player.stop(); } player.release(); player = null; super.onDestroy(); }}
IntentService
发送意图开启service,传递值
String s = mTextUrl.getText().toString(); Intent intent = new Intent(this, DownloadService.class); intent.putExtra("url", s); startService(intent);
public class DownloadIntentService extends IntentService { /** * IntentService 内部包含一个线程,线程会一直处理Intent参数 * 每一次startService 传递的Intent,都自动传递给线程,队列中保存,依次处理 * 这个方法在子线程执行 * @param intent */ @Override protected void onHandleIntent(Intent intent) { String url = intent.getStringExtra("url"); if (url != null) { //TODO: 下载文件,保存文件 } Log.d("DownloadIntentService", "onHandleIntent: " + url); SystemClock.sleep(3000); }}
BindService
发送意图
bindService(intent, this, BIND_AUTO_CREATE);
service 里 写内部类 集成Bind onBind方法 返回内部类对象
发送意图方 可以接收到返回的对象
package example.li_yuweii.servicedemmo;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.IBinder;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.ProgressBar;import android.widget.TextSwitcher;import example.li_yuweii.servicedemmo.service.MusicBindService;public class MusicActivity extends AppCompatActivity implements ServiceConnection,Runnable { private MusicBindService.MusicController mController; private ProgressBar mProgressBar; private boolean running; private Thread mThread; private TextSwitcher mTextSwitcher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_music); mProgressBar = (ProgressBar) findViewById(R.id.music_progress); mTextSwitcher = (TextSwitcher) findViewById(R.id.textswitcher); mTextSwitcher.setInAnimation(this,android.R.anim.fade_in); //绑定服务,使用Context绑定,哪个界面需要绑定,就用哪个Activity Intent intent = new Intent(this, MusicBindService.class); //参数1 Intent代表需要绑定哪一个Service //参数2.回调接口,可以接收到Service连接成功和断开连接的回调 //成功就可以取到对象 //绑定服务,参数2就是服务和指定的对象绑定在一起 bindService(intent, this, BIND_AUTO_CREATE); } @Override protected void onStart() { super.onStart(); mThread = new Thread(this); mThread.start(); } @Override protected void onStop() { super.onStop(); running = false; } @Override protected void onDestroy() { //解除绑定 unbindService(this); super.onDestroy(); } //---------------------------------------- @Override public void run() { running = true; try { while (running) { if (mController != null) { long duration = mController.getDuration(); long currentPosition = mController.getCurrentPosition(); mProgressBar.setMax(((int) duration)); mProgressBar.setProgress(((int) currentPosition)); String time = currentPosition + "/" + duration; mTextSwitcher.setText(time); mTextSwitcher.post(new Runnable() { @Override public void run() { } }); } Thread.sleep(300); } } catch (InterruptedException e) { e.printStackTrace(); } } //---------------------------------------- public void btnMusicPlay(View view) { if (mController != null) { mController.play(); } } public void btnMusicPause(View view) { if (mController != null) { mController.pause(); } } //----------------------------------------------- //服务绑定与解除绑定的回调 /** * 当服务与当前绑定对象,绑定成功,服务的onBind方法,调用并返回之后,回调给这个方法 * @param name * @param service IBind就是 服务onBind返回的对象 */ @Override public void onServiceConnected(ComponentName name, IBinder service) { mController = ((MusicBindService.MusicController) service); } @Override public void onServiceDisconnected(ComponentName name) { mController = null; }}
BindService
package example.li_yuweii.servicedemmo.service;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.Binder;import android.os.IBinder;import example.li_yuweii.servicedemmo.R;public class MusicBindService extends Service { private MediaPlayer mPlayer; public MusicBindService() { } @Override public void onCreate() { super.onCreate(); mPlayer = MediaPlayer.create(this, R.raw.nobody); } /* * 绑定服务的实现流程 * 1.服务 onCreate,onBind,onDestory 方法 * 2.onBind方法 需要返回一个IBinder对象, * 3.如果Activity绑定,Activity就可以取到IBind对象,可以直接调用对象的方法 */ //相同应用内部不同组件绑定,可以使用内部类以及Binder对象来返回 public class MusicController extends Binder { public void play() { mPlayer.start(); } public void pause() { mPlayer.pause(); } public long getDuration() { return mPlayer.getDuration(); } public long getCurrentPosition() { return mPlayer.getCurrentPosition(); } } /** * 当绑定服务的时候自动回调这个方法, * 返回的对象可以直接操作Service内部的内容 * @param intent * @return */ @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return new MusicController(); } /** * 任意一次unbindService()方法,都会触发这个方法 * 用于释放一些绑定时使用的资源 * @param intent * @return */ @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); } @Override public void onDestroy() { if (mPlayer.isPlaying()) { mPlayer.stop(); } mPlayer.release(); mPlayer = null; super.onDestroy(); }}
- Service几种情况介绍和使用
- AIDL的使用情况和实例介绍
- AIDL的使用情况和实例介绍
- AIDL的使用情况和实例介绍
- AIDL的使用情况和实例介绍
- ADO.NET使用的几种情况
- 使用正则的几种情况
- <a>标签的使用几种情况
- i++和++i的几种情况
- css空白边叠加的几种情况介绍
- 查看基于Android 系统单个进程内存和CPU使用情况的几种方法
- JAVA开发Web Service几种框架介绍
- JAVA开发Web Service几种框架介绍
- JAVA开发Web Service几种框架介绍
- JAVA开发Web Service几种框架介绍
- JAVA开发Web Service几种框架介绍
- JAVA开发Web Service几种框架介绍
- JAVA开发Web Service几种框架介绍
- POJ 3624 Charm Bracelet【01背包入门题】
- Gradle For Android Training
- ubuntu12.04开机黑屏解决方法
- IDEA下配置JavaWeb开发环境
- Hsmap
- Service几种情况介绍和使用
- Unity UGUI图文混排源码(三) -- 动态表情
- Mybatis之properties属性
- Spring原理-注入依赖的过程
- 全栈必备Linux 基础
- hdu 5878
- Servlet入门
- hdu 5883 (欧拉路,青岛网络赛)
- 第4周 项目3-- 单链表应用(2)