Android Service 入门
说明
Service 工作在主进程上。生命周期图

两种状态
Started
比如Activity通过调用startService 方法。一旦被启动(Started),服务就永久在后台运行,即使创建他的Activity被销毁。
Bound
当一个Component通过调用bindService方法来绑定该服务。服务提供接口让组件和服务交互。
回调方法说明
onStartCommand 其他组件通过调用startService时,被调用,如果实现该方法,需要调用stopSelf或者stopService来结束服务。
onBind 其他组件通过调用bindService时,被调用。需要实现接口,返回IBinder对象,让Client和服务交互。如果不绑定服务,返回null
onUnbind 所有已经绑定的组件断开
onCreate创建服务只有一次。
onDestroy服务被销毁时调用,这里应该清理相应资源。
例子1:
主界面两个按钮

Activity对应的两个方法
public void startService(View view)
{ startService(new Intent(getBaseContext(), MyService.class));
}
public void stopService(View view)
{
stopService(new Intent(getBaseContext(), MyService.class));
}
服务类的内容
public class MyService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Servcie Started", Toast.LENGTH_LONG).show();
        return START_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service Destroyed", Toast.LENGTH_SHORT).show();
    }
}
然后在AndroidManifest.xml中添加

运行效果
点击启动服务

点击停止服务

例子2:使用绑定服务,并且在Activity中调用Service的内部类的方法
在例子1的基础上
public class MyService extends Service {
    public static final String SERVICE_LOG = "service_LOG";
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(SERVICE_LOG, "MyServic Bound");
        return new Mybind();
    }
    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(SERVICE_LOG, "MyService Unbound");
        return super.onUnbind(intent);
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(SERVICE_LOG, "Myservice created");
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(SERVICE_LOG, "Myservice Started");
        return START_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(SERVICE_LOG, "MyService destroyed");
    }
    public class Mybind extends Binder
    {
        public  void getString() {
            Log.d(SERVICE_LOG, "============> get a string");
        }
    }
}
主要变化,新增内部类Mybind,并且在onBind返回Mybind对象。
Activity中新增

.
新增代码
private MyService.Mybind mybind;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mybind = (MyService.Mybind) iBinder;
mybind.getString();
} @Override
public void onServiceDisconnected(ComponentName componentName) { }
};
public void BindService(View view) {
Intent bindIntent = new Intent(LoginActivity.this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
} public void UnbindService(View view) {
unbindService(connection);
}
全部代码
public class LoginActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_login);
    }
    public void startService(View view)
    {startService(new Intent(getBaseContext(), MyService.class));
    }
    public void stopService(View view)
    {
        stopService(new Intent(getBaseContext(), MyService.class));
    }
    private MyService.Mybind mybind;
    private ServiceConnection connection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            mybind = (MyService.Mybind) iBinder;
            mybind.getString();
        }
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
        }
    };
    public void BindService(View view) {
        Intent bindIntent = new Intent(LoginActivity.this, MyService.class);
        bindService(bindIntent, connection, BIND_AUTO_CREATE);
    }
    public void UnbindService(View view) {
        unbindService(connection);
    }
}
运行效果
A测试
点击绑定服务,此时创建服务,然后绑定服务,
Myservice created
MyService Bound
============> get a string
点击解除绑定(解绑之后,再点击解绑,程序会崩溃)
MyService Unbound
MyService destroyed
如果Activity销毁,服务同样自动解绑,销毁。
B测试
点击启动服务
Myservice created
Myservice Started
点击绑定服务
MyServic Bound
============> get a string
点击解除绑定
MyService Unbound
因为是通过startService创建的后台Service,不会销毁。
如果有client绑定,点击“停止服务”,service 不会停止,一旦所有client解除绑定,因为已经点击过“停止服务”,此时服务停止。
Android Service 入门的更多相关文章
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解
		
原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...
 - android service 本地 远程 总结
		
android编写Service入门 android SDK提供了Service,用于类似*nix守护进程或者windows的服务. Service有两种类型: 本地服务(Local Service) ...
 - Android开发入门要点记录:四大组件
		
cocos2dx跨平台开发中需要了解android开发,昨天快速的浏览了一本Android开发入门教程,因为之前也似懂非懂的写过Activity,Intent,XML文件,还有里面许多控件甚至编程思想 ...
 - [译]:Xamarin.Android开发入门——Hello,Android深入理解
		
返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...
 - [译]:Xamarin.Android开发入门——Hello,Android快速上手
		
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
 - android service两种启动方式
		
android service的启动方式有以下两种: 1.Context.startService()方式启动,生命周期如下所示,启动时,startService->onCreate()-> ...
 - 1、Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco
		
Android studio 集成极光推送(Jpush) (华为手机)报错, E/JPush: [JPushGlobal] Get sdk version fail![获取sdk版本失败!] W/Sy ...
 - Android Service完全解析,关于服务你所需知道的一切(下)
		
转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...
 - Android Service完全解析,关于服务你所需知道的一切(上)
		
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...
 
随机推荐
- python json模块小技巧
			
python的json模块通常用于与序列化数据,如 def get_user_info(user_id): res = {"user_id": 190013234,"ni ...
 - 06-vue项目02:vuex、Mutation、Action、ElementUI、axios
			
1.Vuex 1.为什么使用VueX data从最上面的组件,一层层往下传值,一层层的验证 Vue单向数据流 “中央空调“,代理 VueX 解决数据 传值.. 2.Vuex介绍与安装 (1)Vuex官 ...
 - MFC的静态链接、动态链接
			
项目属性页面可以查看更改编译方式,推荐使用静态编译.也可以在创建MFC项目时选择静态编译. 标准Windows库,使用的是系统API,Win32是面向API的编程平台.Win32项目使用的是此编译方式 ...
 - 路由器配置——基于区域的OSPF简单认证
			
一.实验目的:掌握区域的OSPF简单认证 二.拓扑图: 三.具体步骤配置: (1)R1路由器配置 Router>enable Router#configure terminal Enter co ...
 - 二维FFT,IFFT,c语言实现
			
学习DIP第6天 完整内容迁移至http://www.face2ai.com/DIP-2-4-二维FFT-IFFT-c语言实现/ http://www.tony4ai.com/DIP-2-4-二维FF ...
 - 记录二:tensorflow2.0写MNIST手写体
			
最近学习神经网络,tensorflow,看了好多视频,查找了好多资料,感觉东西都没有融入自己的思维中.今天用tensorflow2.0写了一个MNIST手写体的版本,记录下学习的过程. 复现手写体识别 ...
 - 转载像元素周期表一样的html5的标签图集
			
转载请注明出处. HTML5标签集合
 - js中的DOM对象和jQuery对象的比较
			
1. 二者的不同之处: 通过jQuery获取的元素是一个数组, 数组中包含着原生JS中的DOM对象. 例如, 针对下面的一个div结构: <div id="Box">& ...
 - springMVC课程笔记(一)springMVC架构原理分析
			
一.springMVC架构原理分析 1.先搞清楚什么是springMVC: 其实springMVC是spring框架中的一个模块,springMVC和spring无需通过中间整合层整合,SpringM ...
 - Java 标准 IO 流编程一览笔录( 下 )
			
8.回推流:PushbackInputStream与PushbackReader PushbackInputStream/PushbackReader 用于解析InputStream/Reader内的 ...