Android Service启动方式总结
来源:互联网 发布:sql server exists用法 编辑:程序博客网 时间:2024/06/06 13:01
1、StartService()启动Service的方式:
onCreate-->onStartCommand (可多次调用)-->onDestroy
在onCreate()后,每次startService()将会直接进入onStartCommand,onStart()已经被废弃
在Activity中调用stopService()或在service内部调用stopSelf()结束Service
2、对于bindService()启动Service会经历:
context.bindService()->onCreate()->onBind()->Service running-->onUnbind() -> onDestroy() ->Service stop
Service是可以和多个Activity进行绑定的,但要注意的是,当Activity结束时一定要跟相应的Service解除绑定,不然是会报异常的(Main4Activity has leaked ServiceConnection),虽然此时即使报异常也不会影响Activity的结束了,然后还是会强制的解除绑定。
当多个Activity与Service进行绑定的时候,只有当所有的绑定都解除了之后,Service才会结束。
3、对于既用StartService()和bindService()启动的Service:
这种调用方法可以起到即使与Service绑定的Activity结束了,Service依然不会死掉。这种方式启动的Service需要同时调用stopService()和unbindService()解除了所有绑定之后才能结束Service。
下面是两个Activity绑定一个Service的演示代码:
第一个Activity:
package com.example.administrator.androidtrainingtest;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import android.widget.Button;public class Main3Activity extends AppCompatActivity { private boolean flag; private static final String TAG = "TestActivity"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); Button btnStart = (Button) findViewById(R.id.btnStart); Button btnStop = (Button) findViewById(R.id.btuStop); Button butStartActivity = (Button) findViewById(R.id.btnStartActivity); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //启动service 方式2 bindService(); } }); btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //停止service 方式2 unBindService(); } }); butStartActivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Main3Activity.this, Main4Activity.class)); } }); } //启动service 方式2 // private void bindService(){ Intent intent = new Intent(Main3Activity.this,BindService.class); Log.i(TAG, "bindService()"); bindService(intent, conn, Context.BIND_AUTO_CREATE); } private void unBindService(){ Log.i(TAG, "unBindService() start...."); if(flag == true){ Log.i(TAG, "unBindService() flag"); unbindService(conn); flag = false; } } private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub Log.i(TAG, "onServiceDisconnected()"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub Log.i(TAG, "onServiceConnected()"); BindService.MyBinder binder = (BindService.MyBinder)service; BindService bindService = binder.getService1(); bindService.MyMethod(); flag = true; } };}
第二个Activity:
package com.example.administrator.androidtrainingtest;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import android.widget.Button;public class Main4Activity extends AppCompatActivity { private boolean flag; private static final String TAG = "TestActivity"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main4); Button btnStart = (Button) findViewById(R.id.btnStart); Button btnStop = (Button) findViewById(R.id.btuStop); Button butStartActivity = (Button) findViewById(R.id.btnStartActivity); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //启动service 方式2 bindService(); } }); btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //停止service 方式2 unBindService(); } }); } //启动service 方式2 // private void bindService(){ Intent intent = new Intent(Main4Activity.this,BindService.class); Log.i(TAG, "bindService()"); bindService(intent, conn, Context.BIND_AUTO_CREATE); } private void unBindService(){ Log.i(TAG, "unBindService() start...."); if(flag == true){ Log.i(TAG, "unBindService() flag"); unbindService(conn); flag = false; } } private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub Log.i(TAG, "onServiceDisconnected()"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub Log.i(TAG, "onServiceConnected()"); BindService.MyBinder binder = (BindService.MyBinder)service; BindService bindService = binder.getService1(); bindService.MyMethod(); flag = true; } };}
Service:
package com.example.administrator.androidtrainingtest;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.util.Log;public class BindService extends Service { private static final String TAG = "BindService"; private MyBinder myBinder = new MyBinder(); public void MyMethod(){ Log.i(TAG, "BindService-->MyMethod()"); } @Override public IBinder onBind(Intent intent) { Log.i(TAG, "BindService-->onBind()"); return myBinder; } public class MyBinder extends Binder { public BindService getService1(){ return BindService.this; } } @Override public void onCreate() { Log.i(TAG, "BindService-->onCreate()"); super.onCreate(); } @Override public void onStart(Intent intent, int startId) { Log.i(TAG, "BindService-->onStart()"); super.onStart(intent, startId); } @Override public void onDestroy() { Log.i(TAG, "BindService-->onDestroy()"); super.onDestroy(); } @Override public boolean onUnbind(Intent intent) { Log.i(TAG, "BindService-->onUnbind()"); return super.onUnbind(intent); }}
两次绑定及解除绑定的结果:
09-07 19:08:40.458 9536-9536/com.example.administrator.androidtrainingtest I/TestActivity: bindService()09-07 19:08:40.468 9536-9536/com.example.administrator.androidtrainingtest I/BindService: BindService-->onCreate()09-07 19:08:40.488 9536-9536/com.example.administrator.androidtrainingtest I/BindService: BindService-->onBind()09-07 19:08:40.498 9536-9536/com.example.administrator.androidtrainingtest I/TestActivity: onServiceConnected()09-07 19:08:40.498 9536-9536/com.example.administrator.androidtrainingtest I/BindService: BindService-->MyMethod()09-07 19:08:43.961 9536-9536/com.example.administrator.androidtrainingtest I/Timeline: Timeline: Activity_launch_request time:2096552109-07 19:08:44.071 9536-9536/com.example.administrator.androidtrainingtest D/ActivityThreadInjector: clearCachedDrawables.09-07 19:08:44.262 9536-9581/com.example.administrator.androidtrainingtest D/OpenGLRenderer: endAllActiveAnimators on 0xb4f90580 (RippleDrawable) with handle 0xa520db6009-07 19:08:44.272 9536-9536/com.example.administrator.androidtrainingtest I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@3dcf5808 time:2096583209-07 19:08:45.943 9536-9536/com.example.administrator.androidtrainingtest I/TestActivity: bindService()09-07 19:08:45.963 9536-9536/com.example.administrator.androidtrainingtest I/TestActivity: onServiceConnected()09-07 19:08:45.963 9536-9536/com.example.administrator.androidtrainingtest I/BindService: BindService-->MyMethod()09-07 19:08:48.426 9536-9547/com.example.administrator.androidtrainingtest I/art: Debugger is no longer active09-07 19:09:17.444 9536-9536/com.example.administrator.androidtrainingtest I/TestActivity: unBindService() start....09-07 19:09:17.444 9536-9536/com.example.administrator.androidtrainingtest I/TestActivity: unBindService() flag09-07 19:09:21.658 9536-9536/com.example.administrator.androidtrainingtest I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@178fe5a8 time:2100322809-07 19:09:24.120 9536-9536/com.example.administrator.androidtrainingtest I/TestActivity: unBindService() start....09-07 19:09:24.120 9536-9536/com.example.administrator.androidtrainingtest I/TestActivity: unBindService() flag09-07 19:09:24.131 9536-9536/com.example.administrator.androidtrainingtest I/BindService: BindService-->onUnbind()09-07 19:09:24.131 9536-9536/com.example.administrator.androidtrainingtest I/BindService: BindService-->onDestroy()09-07 19:09:27.043 9536-9547/com.example.administrator.androidtrainingtest I/art: Debugger is no longer active
1 0
- Android Service启动方式总结
- Android Service 启动方式
- Android Service启动方式以及生命周期以及通信总结
- Android Service两种启动方式详解(总结版)
- Android Service的启动方式
- Android Service的启动方式
- Android之Service启动方式
- service 总结之启动方式和生命周期
- Android Service两种启动方式
- Android Service两种启动方式
- Android Service 两种启动方式
- Android Service的两种启动方式
- Android Service两种启动方式
- Android Service的两种启动方式
- Android Service两种启动方式
- Android Service两种启动方式
- Android中的Service(使用StartService 方式启动)
- Android 启动Service的方式和区别
- 第11章上机练习
- MFC combox 如何设置下拉框的大小?
- 谈谈find,xargs,管道
- [Leetcode]57. Insert Interval
- PHP基础知识 - get与post的区别
- Android Service启动方式总结
- Ncurses 命令行图形库
- Android性能优化之内存泄漏分析工具LeakCanary
- 重建hdfs后,Hbase无法使用
- Drools6 动态读取数据库规则
- 复习 Accp7.0 第11章
- 项目3-体验复杂度(2)
- linux设备模型之 kobject原理与实例分析
- angularjs中的复选框checkbox