安卓中服务的开启方式

一:採用start的方式开启服务

调用函数:startService(Intent)->onCreate()->onStart()/onStartCommand()->onDestroy()

特点:服务被开启后不会反复开启,仅仅会调用onStart(),服务仅仅会被停止一次。

二:採用bind的方式开发服务

调用函数:bindService(Intent…)->onCreate()->onBind()->onUnBind()->onDestroy();

特点:绑定不会调用onStart()[过时了]和onStartCommand()方法。

两种服务的差别:

start方式开发服务,一旦服务开启跟调用者就没有不论什么关系了。比方我们的服务是在Activity中调用开启的,当Activity关闭的时候,服务不会关闭。

bind方式开启服务,调用者没了。服务也会关闭,能够理解为同生共死。

对于start开启服务的方式比較简单。重点解说bind的方式。

样例:

1.布局里面设置三个button



2.为button设置监听事件。有好几种方式。

3.处理事件。

当点击绑定的时候:

    /*绑定的创建方式
*/
Intent intent = new Intent(this, MyService.class);
bindService(intent, conn, BIND_AUTO_CREATE);

conn是自己实现的功能类,继承自ServiceConnection。

完整代码例如以下:

public class MainActivity extends ActionBarActivity {
private MyConn conn;
private Call c;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//Call相似中间人的功能。
}
public void bind(View v){
conn = new MyConn();
Intent intent = new Intent(this, MyService.class);
bindService(intent, conn, BIND_AUTO_CREATE);
} public void unbind(View v){
unbindService(conn);
c = null;
}
/*
* 调用服务里的方法
*/
public void call(View v){
c.callMethodInService();
} private class MyConn implements ServiceConnection{ @Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("调用服务里面的方法");
c = (Call) service;
} @Override
public void onServiceDisconnected(ComponentName name) { }
}
}

service代码例如以下:

public class MyService extends Service {

    @Override
public IBinder onBind(Intent intent) {
System.out.println("服务被成功绑定了");
return new Call();
} @Override
public void onCreate() {
System.out.println("onCreate");
super.onCreate();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("onstartCommand");
return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
System.out.println("ondestroy");
super.onDestroy();
} public void methodInService(){
Toast.makeText(this, "methodInService", 0).show();
} public class Call extends Binder{
public void callMethodInService(){
methodInService();
}
}
}

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.servicelife.MainActivity" >
<Button android:onClick="bind"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="start"/> <Button android:onClick="unbind"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="end"/> <Button android:onClick="call"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="调用服务里的方法"/> </LinearLayout>

点击下载源码

安卓服务(Service)的两种开启方式以及服务的生命周期的更多相关文章

  1. Service的两种启动方式

    今天又写Service,提示覆写onBind(),想起Android好像是有个叫做Binder的IPC机制. Service里面有一个onBind(),一个onStartCommand(),两者都能启 ...

  2. Android四大组件之服务的两种启动方式详解

    Service简单概述 Service(服务):是一个没有用户界面.可以在后台长期运行且可以执行操作的应用组件.服务可由其他应用组件启动(如:Activity.另一个service).此外,组件可以绑 ...

  3. XFire构建服务端Service的两种方式(转)

    XFire构建服务端service的两种方式,一是用xfire构建,二是和spring集成构建. 一,xifre构建,确保把xfire的jar包导入到工程中或classpath. 1,service的 ...

  4. XFire构建服务端Service的两种方式

    1.原声构建: 2.集成spring构建 http://blog.csdn.net/carefree31441/article/details/4000436XFire构建服务端Service的两种方 ...

  5. 三,memcached服务的两种访问方式

    memcached有两种访问方式,分别是使用telnet访问和使用php访问. 1,使用telnet访问memcacehd 在命令提示行输入, (1)连接memcached指令:telnet 127. ...

  6. Service的两种用法及其生命周期

    先来一点基础知识: Service 是android的四大组件之一,与Activity同属于一个级别,它是运行在后台进行服务的组件(例如在后台播放的音乐,播放音乐的同时并不影响其他操作).Servic ...

  7. 探究Redis两种持久化方式下的数据恢复

    对长期奋战在一线的后端开发人员来说,都知道redis有两种持久化方式RDB和AOF,虽说大家都知道这两种方式大概运作方式,但想必有实操的人不会太多. 这里是自己实操两种持久化方式的一点点记录. 先看以 ...

  8. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  9. WCF 客户端调用服务操作的两种方法

    本节的主要内容:1.通过代理类的方式调用服务操作.2.通过通道的方式调用服务操作.3.代码下载 一.通过代理类的方式调用服务操作(两种方式添加代理类) 1.手动编写代理类,如下: 客户端契约: usi ...

随机推荐

  1. ngui 脚本绘制sprite

    public GameObject _background; public UIAtlas atlas; private Dictionary<int, UISprite> _allCar ...

  2. bzoj4525: [Usaco2016 Jan]Angry Cows

    二分. #include<cstdio> #include<algorithm> #include<cstring> using namespace std; + ...

  3. UEFI GPT

    其实关于UEFI的几篇文章很早就写下了,只是自己读了一遍感觉很不满意,就决定重写.目的是想用最简单直白的语言把内容写出来,让每个人都能轻松读懂.当然,如果你已经对这些内容有了很深的理解的话,这篇文章除 ...

  4. 让Codeigniter控制器支持多级目录

    <?php if (!defined('BASEPATH')) { exit ('No direct script access allowed');} class MY_Router exte ...

  5. 打造自己的reset.css

    http://shawphy.com/2009/03/my-own-reset-css.html 最近我对此观点有所新的看法,可以查看<真的还需要reset.css么?> 0,引言 每每有 ...

  6. tomcat server.xml配置详解

    由于 Tomcat 基于 Java,实际上在各种 Linux 发行版里的配置方法都大同小异,只是我看见在 Arch Linux 环境里搭建 Tomcat 的文章比较少,所以在 Arch Linux 实 ...

  7. Android中全屏或者取消标题栏

    先介绍去掉标题栏的方法: 第一种:也一般入门的时候经常使用的一种方法 requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 注意这句一定要写在se ...

  8. Oracle 参数化更新数据时报错:Oracle ORA-01722: 无效数字

    报错:Oracle ORA-01722: 无效数字 看了一篇博客,据说是参数与列名不能一致,改过之后还是报一样的错误:Oracle ORA-01722: 无效数字 ,后来试了一下,不是参数名必须不一样 ...

  9. CF 560e Gerald and Giant Chess

    题意:在h×w的棋盘中从左上角走到右下角,只能向右或向下走,有n个点不可以经过,一共有多少种方案. 解法:dp.先对点按横坐标排序(横坐标相等按纵坐标,也可以反过来)dp[i]表示不经过其他非法点走到 ...

  10. BlockingQueue汇总

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便 ...