说明

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 入门的更多相关文章

  1. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  2. android service 本地 远程 总结

    android编写Service入门 android SDK提供了Service,用于类似*nix守护进程或者windows的服务. Service有两种类型: 本地服务(Local Service) ...

  3. Android开发入门要点记录:四大组件

    cocos2dx跨平台开发中需要了解android开发,昨天快速的浏览了一本Android开发入门教程,因为之前也似懂非懂的写过Activity,Intent,XML文件,还有里面许多控件甚至编程思想 ...

  4. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  5. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  6. android service两种启动方式

    android service的启动方式有以下两种: 1.Context.startService()方式启动,生命周期如下所示,启动时,startService->onCreate()-> ...

  7. 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 ...

  8. Android Service完全解析,关于服务你所需知道的一切(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

  9. Android Service完全解析,关于服务你所需知道的一切(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...

随机推荐

  1. Web自动化简介

    在迭代中时,先写出粗略的自动化测试用例,不是非常精准的一些提示,等到项目上线后,提示文案已经确定,再完善用例,使之成为一个完整的自动化测试工程. 用excel管理测试数据,读取效率比较低,需要读取.数 ...

  2. 【Python之路】特别篇--组合搜索功能实现

    组合搜索: 根据特定标签内容,返回符合的数据. 效果图: 设计规划: 一.数据库表划分: 1.方向表,(运维自动化,Python开发,..) 2.分类表,(Python,Java,C#,.) 3.多对 ...

  3. SQL Server text field里面有换行符的时候copy到excel数据会散乱

    解决方法: select '"'+convert(varchar(8000),testField)+'"'astestField from testTable 这样虽然结果集里面有 ...

  4. 制作自己的livecd

    把现有ubuntu系统打包,迁移到另外一台硬件一模一样的机器上. https://zhuanlan.zhihu.com/p/51827233 https://blog.csdn.net/vah101/ ...

  5. 第二章 Python数据导入

    数据导入 数据存储的两个地方: 文件 CSV.Excel.TXT(学习层面) 数据库(公司实战层面) Mysql.Access.SQL Server 导入CSV文件 CSV文件第一行是列名,第二行到最 ...

  6. Java字节码例子解析

    举个简单的例子: public class Hello {     public static void main(String[] args) {         String string1 = ...

  7. Jmeter(十四)取样器之JDBC Request

    在接口测试中,需要与数据库进行交互,这时候需要用到JDBC Request取样器. JDBC Request可以向数据库发送一个请求(sql语句),一般它需要配合JDBC Connection Con ...

  8. Educational Codeforces Round 64 (Rated for Div. 2) A,B,C,D,E,F

    比赛链接: https://codeforces.com/contest/1156 A. Inscribed Figures 题意: 给出$n(2\leq n\leq 100)$个数,只含有1,2,3 ...

  9. php-m 与 phpinfo 不一致的解决办法

    1.查看PHP当前加载的php.ini文件地址,在控制台输入以下命令: 1 php -i | grep php.ini 2.控制台返回的信息 1 2 Configuration File (php.i ...

  10. godaddy SSL证书不信任

    在使用网上教程的部署godaddy证书,会出现证书不受信任的情况. 各别审核比较严格的浏览器会阻止或者要求添加例外.情况如下: 利用在线证书测试工具会提示根证书的内容为空.从而导致证书不受信任. 解决 ...