android服务之启动方式
服务有两种启动方式
- 通过startService方法来启动
- 通过bindService来开启服务
布局文件
在布局文件中我们定义了四个按键来测试这两种方式来开启服务的不同
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="开始服务"
android:onClick="start"/>
<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="停止服务"
android:onClick="stop"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="绑定服务"
android:onClick="bind"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="解绑"
android:onClick="unbind"/>
</LinearLayout>
Activity
在Activity中我们使用了这两种方式来开启服务
package xidian.dy.com.chujia; import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
Intent service;
MyConnection mc;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
service = new Intent(this, MyService.class);
mc = new MyConnection();
} public void start(View v){
Toast.makeText(this,"开启服务",Toast.LENGTH_SHORT).show();
startService(service);
} public void stop(View v){
Toast.makeText(this,"关闭服务",Toast.LENGTH_SHORT).show();
stopService(service);
} public void bind(View v){
bindService(service,mc,BIND_AUTO_CREATE);
} public void unbind(View v){
unbindService(mc);
} class MyConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) { } @Override
public void onServiceDisconnected(ComponentName name) { }
}
}
注意在绑定服务的时候需要传入回调函数(第二个参数),当绑定成功会调用onServiceConnected方法,当解除绑定会调用onServiceDisconnected方法。
Service
在服务代码中我们将各个方法复写了一边,其实代码中各个方法也表示了服务的生命周期。
package xidian.dy.com.chujia; import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log; /**
* Created by dy on 2016/7/12.
*/
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
Log.i(this.getClass().getName(), "****start方法****");
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(this.getClass().getName(), "*****startCommand方法*****");
return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
Log.i(this.getClass().getName(), "***Destroy方法***");
super.onDestroy();
} @Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i(this.getClass().getName(), "****Bind方法被调用****");
return null;
} @Override
public boolean onUnbind(Intent intent) {
Log.i(this.getClass().getName(),"****unBind方法被调用****");
return super.onUnbind(intent);
}
}
两者区别

启动服务
- 点击开始服务

- 点击返回按键销毁Activity,我们发现服务仍在运行

- 点击停止服务

绑定服务
- 点击绑定服务

- 点击返回按键销毁Activity,则会抛出异常并且有两方法被调用


通过对比我们发现startService开启的服务是独立运行的,而通过bindService开启的服务则依赖于Activity,但Activity被销毁时绑定的服务也被销毁了
android服务之启动方式的更多相关文章
- android activity的启动方式
1.Standard正常启动,默认的启动方式,没什么说头 2.SingleTop 意思就是在栈顶只能存在一个相同的activity 不能叠加,如果再A上继续启动A的话,只会调用A的onNewInten ...
- android service两种启动方式
android service的启动方式有以下两种: 1.Context.startService()方式启动,生命周期如下所示,启动时,startService->onCreate()-> ...
- Android service介绍和启动方式
1.Android service的作用: service通常是用来处理一些耗时操作,或后台执行不提供用户交互界面的操作,例如:下载.播放音乐. 2.Android service的生命周期: ser ...
- Android服务之PackageManagerService启动源码分析
了解了Android系统的启动过程的读者应该知道,Android的所有Java服务都是通过SystemServer进程启动的,并且驻留在SystemServer进程中.SystemServer进程在启 ...
- Android界面组件的四种启动方式
Android界面组件启动有四种方式 standard,singleTop,singleTask,singleInstance. standard:每次调用都会都会产生新的组件. singletop: ...
- Android Init进程命令的执行和服务的启动
这里开始分析init进程中配置文件的解析,在配置文件中的命令的执行和服务的启动. 首先init是一个可执行文件,它的对应的Makfile是init/Android.mk. Android.mk定义了i ...
- Android系统Surface机制的SurfaceFlinger服务的启动过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8022957 在前面一篇文章中,我们简要介绍了A ...
- Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。
原文:Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式. Android Activity 的四种启动模 ...
- Hive 学习笔记(启动方式,内置服务)
一.Hive介绍 Hive是基于Hadoop的一个数据仓库,Hive能够将SQL语句转化为MapReduce任务进行运行. Hive架构图分为以下四部分. 1.用户接口 Hive有三个用户接口: 命令 ...
随机推荐
- spring多数据源的处理 mybatis实现跨库查询
实现Myibatis动态sql跨数据库的处理 Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不 同于常见 ...
- 二:C语言(分之结构)
一:if语句 二:while语句 #include <stdio.h> int main() { ; i=; ) //循环条件应该是什么呢? { sum=sum+i; i++ ; //这里 ...
- 解决Qt在openSUSE上编译出现“cannot find -lGL”错误
在openSUSE上编译QT5.4程序出现“cannot find -lGL”,就连example都无法通过编译.QT是在官网下的最新的安装包. 大体意思是,缺少qt运行时所需要的openGL库.决绝 ...
- Windows Azure 负载均衡会话保持
Windows Azure的负载均衡器默认是5元组的hash:源地址,源端口,目的地址,目的端口,协议.即:只有上述五个元组完全一致的会话数据包才会被转发到同一个后端服务器.显然,对于绝大多数通过NA ...
- checkbox勾选判断
var xieYi=document.getElementById("xieYi"); if(!xieYi.checked){ alert("请先阅读并勾选购买协议!&q ...
- 好好写,好好干-PHP基础(二)
hi 好久没写,昨儿一写,感觉还是有人看的,至少是有一两个评论的~~好好干! 每天需要坚持的就那么4件事儿:写这个,学一点法语,看会儿书,锻炼.单身狗也有好处. 1.PHP 一.PHP基础(二) 1. ...
- NOIP2010提高组 机器翻译 -SilverN
/**/ #include<iostream> #include<cstdio> #include<cmath> #include<cstring> # ...
- ZooKeeper开发手册中文翻译(转)
本文Github地址:https://github.com/sundiontheway/zookeeper-guide-cn 本文假设你已经具有一定分布式计算的基础知识.你将在第一部分看到以下内容: ...
- HttpURLConnection用法详解
针对JDK中的URLConnection连接Servlet的问题,网上有虽然有所涉及,但是只是说明了某一个或几个问题,是以FAQ的方式来解决的,而且比较零散,现在对这个类的使用就本人在项目中的使用经验 ...
- .net(c#)提取多层嵌套的JSON
Newtonsoft.Json.Net20.dll 下载请访问http://files.cnblogs.com/hualei/Newtonsoft.Json.Net20.rar 在.net 2.0中提 ...