service解读服务(service调用service)
service解读服务(service调用service),新营销网红网本栏目通过数据整理汇集了service解读服务(service调用service)相关信息,下面一起看看。
1.螺纹的相关概念
在开始学习服务之前,我们先来学习一些线程的概念!
1)相关概念
程序为了完成特定的任务,用某种语言编写的一组指令(一组静态代码)。
进程一个正在运行的程序,一个独立的系统调度和资源分配单元。操作系统会为每个进程分配一个内存空间!程序依次动态执行,体验代码加载、执行、完成的完整过程!
线程比进程小的执行单元。每个进程可以有多个线程。线程需要放在一个要执行的进程中。线程由程序管理,而进程由系统调度!
多线程的理解并行执行多条指令,按照调度算法给每个线程分配CPU时间片,其实是分时的,只是切换时间很短,用户感觉是的!
2)线程的生命周期
3)创建线程的三种方法
继承线程类
实现可运行接口
要实现可调用接口,如果你正在使用由2创建的线程,你可以像这样直接启动它
新线(myThread)。start();
当更多的时候,我们喜欢使用匿名类,也就是下面的写法
新线程(新Runnable(){
public void run();
}).start();
2.2的区别。服务和线程线程
其实两者没有太大的关系,只是很多朋友经常把两者混淆!线程就是线程,程序执行的最小单位,CPU分配的基本单位!服务是Android提供的一个组件,允许它长时间呆在后台。最常见的用法是轮询!或者想在后台做点什么,比如后台下载更新!切记不要混淆这两个概念!
3.3的生命周期图。服务
4.生命周期分析
好了,从上图的生命周期中,我们可以知道Android中有两种使用Service的方式
1)StartService()启动服务。
2)BindService()启动服务
还有一种PS:就是启动服务后,绑定服务!
1)相关详细解释
OnCreate():服务第一次创建时,立即回调,整个生命周期只调用一次!
OnDestory():服务关闭时会被回调,而且只会回调一次!
OnStartCommand (Intent,Flag,startId):早期版本是onStart(intent,StartID)。当客户端调用startService(Intent)时,它会回调。可以多次调用StartService,但不是创建新的服务对象,而是继续重用之前生成的服务对象,而是继续回调Onstart Command()!
IBinder onOnbind(intent):这必须由所有服务实现。它将返回一个iBinder对象,应用程序通过该对象与服务组件进行通信!
OnUnbind(意图):这个!当绑定到此服务的所有客户端断开连接时,将被回调!
2)StartService启动服务
第一次启动会创建一个服务实例,依次调用onCreate()和onStartCommand()。此时,服务将会运行。如果调用StartService启动服务,不会创建新的服务对象,系统会直接重用之前创建的服务对象,并调用其onStartCommand()!
这样的服务和它的调用者没有必然的联系,也就是说,当调用者结束了他的生命周期,只要stopService没有被调用,服务就会继续运行!
无论服务启动多少次,都只需要调用一次StopService就可以停止服务。
3)BindService启动服务
第一次使用bindService绑定服务时,系统会实例化一个服务实例,调用它的onCreate()和onBind(),那么调用方就可以通过IBinder与服务进行交互。之后如果使用bindService绑定服务,系统不会创建新的服务实例,也不会调用onBind(),只会直接将IBinder对象传递给后面添加的其他客户端!
如果我们解除服务的绑定,只需要调用unbindService(),然后就会调用onUnbind和onDestory!这是一个客户的情况。如果多个客户端绑定同一个服务,情况如下。客户端完成与服务的交互后,调用unbindService()来解除绑定。当所有客户端与服务解除绑定时,系统将销毁服务。(除非该服务也是由startService()启动的)
,与上述情况不同,bindService模式下的服务与调用者是相互关联的,可以理解为一根绳上的蚂蚱,同归于尽,在
bindService后,一旦调用者销毁,那么Service也立即终止!
通过BindService调用Service时调用的Context的bindService的解析bindService(Intent Service,ServiceConnection conn,int flags)
service:通过该intent指定要启动的Service
conn:ServiceConnection对象,用户监听访问者与Service间的连接情况, 连接成功回调该对象中的onServiceConnected(ComponentName,IBinder) ; 如果Service所在的宿主由于异常终止或者其他原因终止,导致Service与访问者间断开 连接时调用onServiceDisconnected(CompanentName) ,主动通过unBindService() 断开并不会调用上述 !
flags:指定绑定时是否自动创建Service(如果Service还未创建), 参数可以是0(不自动创建),BIND_AUTO_CREATE(自动创建)
4)StartService启动Service后bindService绑定
如果Service已经由某个客户端通过StartService()启动,接下来由其他客户端 再调用bindService()绑定到该Service后调用unbindService()解除绑定在 调用bindService()绑定到Service的话,此时所触发的生命周期 如下:
onCreate( )- onStartCommand( )- onBind( )- onUnbind( )- onRebind( )
PS:前提是:onUnbind() 返回true!!! 这里或许部分读者有疑惑了,调用了unbindService后Service不是应该调用 onDistory() 么!其实这是因为这个Service是由我们的StartService来启动的 ,所以你调用onUnbind() 取消绑定,Service也是不会终止的!
得出的结论:假如我们使用bindService来绑定一个启动的Service,注意是已经启动的Service!!! 系统只是将Service的内部IBinder对象传递给Activity,并不会将Service的生命周期 与Activity绑定,调用unBindService( ) 取消绑定时,Service也不会被销毁!
5.生命周期验证
接下来我们写代码来验证下生命周期
1)验证StartService启动Service的调用顺序
我们自定义一个Service,重写相关的 ,用户在logcat上打印验证:
TestService1.java
public class TestService1 extends Service {
private final String TAG = TestService1
//必须要实现的
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, onBind 被调用!
return null;
}
//Service被创建时调用
@Override
public void onCreate() {
Log.i(TAG, onCreate 被调用!
super.onCreate();
}
//Service被启动时调用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, onStartCommand 被调用!
return super.onStartCommand(intent, flags, startId);
}
//Service被关闭之前回调
@Override
public void onDestroy() {
Log.i(TAG, onDestory 被调用!
super.onDestroy();
}
}
AndroidManifest.xml完成Service注册
!-- 配置Service组件,配置一个action --
service android:name= .TestService1
intent-filter
action android:name= com.jay.example.service.TEST_SERVICE1 /
/intent-filter
/service
再接着是简单的布局文件,两个按钮,再是MainActivity的编写,在按钮的点击事件中分别 调用startService( )和stopService( )!
public class MainActivity extends Activity {
private Button start;
private Button stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start = (Button) findViewById(R.id.btnstart);
stop = (Button) findViewById(R.id.btnstop);
//创建启动Service的Intent,以及Intent属性
final Intent intent = new Intent();
intent.setAction( com.jay.example.service.TEST_SERVICE1
//为两个按钮设置点击事件,分别是启动与停止service
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startService(intent);
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent);
}
});
}
}
运行截图
点击开始服务:
吃饱饭没事做,点多几下:
点击停止服务:
结果分析
从上面的运行结果我们可以验证我们生命周期图中解释的内容: 我们发现onBind() 并没有被调用,多次点击启动Service,只会重复地调用onStartCommand !无论我们启动多少次Service,一个stopService就会停止Service!
2)验证BindService启动Service的顺序:
在开始讲写代码之前,我们先要来了解一些东西先: 是第一个大图下面给出的Context的bindService
ServiceConnection对象:监听访问者与Service间的连接情况,如果成功连接,回调 onServiceConnected(),如果异常终止或者其他原因终止导致Service与访问者断开 连接则回调onServiceDisconnected ,调用unBindService()不会调用该 !
onServiceConnected 中有一个IBinder对象,该对象即可实现与被绑定Service 之间的通信!我们再开发Service类时,默认需要实现IBinder onBind() ,该 返回的 IBinder对象会传到ServiceConnection对象中的onServiceConnected的参数,我们就可以 在这里通过这个IBinder与Service进行通信!
Step 1:在自定义的Service中继承Binder,实现自己的IBinder对象
Step 2:通过onBind( ) 返回自己的IBinder对象
Step 3:在绑定该Service的类中定义一个ServiceConnection对象,重写两个 , onServiceConnected和onDisconnected!然后直接读取IBinder传递过来的参数即可!
那么好了,接下来就是写代码验证了,这里的话我们定义一个用来计时的Service, 然后来演示BindService的用法以及 调用流程!代码比较简单,不解释了!
TestService2.java:
public class TestService2 extends Service {
private final String TAG = TestService2
private int count;
private boolean quit;
//定义onBinder 所返回的对象
private MyBinder binder = new MyBinder();
public class MyBinder extends Binder
{
public int getCount()
{
return count;
}
}
//必须实现的 ,绑定改Service时回调该
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, onBind 被调用!
return binder;
}
//Service被创建时回调
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, onCreate 被调用!
//创建一个线程动态地修改count的值
new Thread()
{
public void run()
{
while(!quit)
{
try
{
Thread.sleep(1000);
}catch(InterruptedException e){e.printStackTrace();}
count++;
}
};
}.start();
}
//Service断开连接时回调
@Override
public boolean onUnbind(Intent intent) {
Log.i(TAG, onUnbind 被调用!
return true;
}
//Service被关闭前回调
@Override
public void onDestroy() {
super.onDestroy();
this.quit = true;
Log.i(TAG, onDestroyed 被调用!
}
@Override
public void onRebind(Intent intent) {
Log.i(TAG, onRebind 被调用!
super.onRebind(intent);
}
}
在AndroidManifest.xml中对Service组件进行注册:
service android:name= .TestService2 android:exported= false
intent-filter
action android:name= com.jay.example.service.TEST_SERVICE2 /
/intent-filter
/service
MainActivity.java:
public class MainActivity extends Activity {
private Button btnbind;
private Button btncancel;
private Button btnstatus;
//保持所启动的Service的IBinder对象,定义一个ServiceConnection对象
TestService2.MyBinder binder;
private ServiceConnection conn = new ServiceConnection() {
//Activity与Service断开连接时回调该
@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println( ------Service DisConnected-------
}
//Activity与Service连接成功时回调该
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println( ------Service Connected-------
binder = (TestService2.MyBinder) service;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnbind = (Button) findViewById(R.id.btnbind);
btncancel = (Button) findViewById(R.id.btncancel);
btnstatus = (Button) findViewById(R.id.btnstatus);
final Intent intent = new Intent();
intent.setAction( com.jay.example.service.TEST_SERVICE2
btnbind.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//绑定service
bindService(intent, conn, Service.BIND_AUTO_CREATE);
}
});
btncancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//解除service绑定
unbindService(conn);
}
});
btnstatus.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), Service的count的值为:
+ binder.getCount(), Toast.LENGTH_SHORT).show();
}
});
}
}
运行截图
点击锁定Service:
继续点击锁定:没任何变化
获取当前Service的状态:
相关文章
橄榄油的用途(吃点橄榄油反而有好处)
增广贤文朗读(《增广贤文》10种智慧)
坚韧不拔是什么意思(如何理解坚韧不拔和躺平的异同?)
梧州景点
热恋期多久(男女的热恋期持续多久)
怎样查手机流量(快速查询手机话费流量)
诸葛亮草船借箭歇后语(《三国演义》的歇后语)
根目录是什么意思(linux ~/.是什么目录)
postalcode(英语地址怎么写?)
天文望远镜多少钱(星特朗SCTW-80天文望远镜评测)
十八罗汉排名(中国神话里十八罗汉的排序)
丑小鸭主要内容(《丑小鸭》导读)
更多service解读服务(service调用service)相关信息请关注本文章,本文仅仅做为展示!