服务 Service 基本介绍

Activity


public class MainActivity extends ListActivity {

    private boolean flag;//是否开启线程

    public static final String ACTION_TEST_SERVICE = "com.bqt.service.TEST_SERVICE";

    private MyServiceConnection conn;

    private IBinderInterface mIBinder;//之所以另外定义一个接口IBinderInterface,而不是直接用MyService.MyBinder,是为了使用统一接口访问,达到解耦、隐藏的目的

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        List<String> mData = new ArrayList<String>(Arrays.asList("开启一个线程,执行死循环操作", "关闭上面开启的所有线程",//

                "startService方式开启服务", "stopService方式关闭服务", "bindService方式开启服务 ", "unbindService方式解除绑定服务",//

                "startService启动服务后再bindService", "通过IBinder间接调用服务中的方法"));

        ListAdapter mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mData);

        setListAdapter(mAdapter);

        conn = new MyServiceConnection();

    }

    @Override

    protected void onListItemClick(ListView l, View v, int position, long id) {

        switch (position) {

        case 0:

            flag = true;

            final long time = System.currentTimeMillis();//当前时间的毫秒值

            Toast.makeText(MainActivity.this, "一个新的线程已开启……", Toast.LENGTH_SHORT).show();

            new Thread(new Runnable() {

                @Override

                public void run() {

                    while (flag) {

                        Log.i("bqt", (System.currentTimeMillis() - time) / 1000 + "");//多少秒

                        try {

                            Thread.sleep(1000);

                        } catch (InterruptedException e) {

                            e.printStackTrace();

                        }

                    }

                }

            }).start();

            break;

        case 1:

            flag = false;

            Toast.makeText(MainActivity.this, "所有线程已关闭……", Toast.LENGTH_SHORT).show();

            break;

        case 2://startService方式开启服务。onCreate()--> onStartCommand() --->onDestory() 。onBind()方法并没有

            startService(new Intent(this, MyService.class));//当调用者结束了自己的生命周期,但是只要没调用stopService,那么Service还是会继续运行

            break;

        case 3://stopService方式关闭服务。service不建议采用隐式方式启动,在高版本可能警告"不安全",更高版本可能直接异常退出

            stopService(new Intent(ACTION_TEST_SERVICE));//服务只会被停止一次,但多次调用并不会异常

            break;

        case 4://绑定的方式开启服务 onCreate() --->onBind();--->onUnbind()-->onDestory()  绑定服务不会调用onStartCommand方法

            bindService(new Intent(this, MyService.class), conn, BIND_AUTO_CREATE);//flags:绑定时如果Service还未创建是否自动创建;0:不自动创建;1:自动创建

            break;

        case 5:

            unbindService(conn);//多次调用会异常!

            mIBinder = null;//若不把mIBinder置为空,则服务销毁后仍然可以调用服务里的方法,因为内部类的引用还在

            break;

        case 6:

            startService(new Intent(this, MyService.class));

            //使用bindService来绑定一个【已启动】的Service时,系统只是将Service的内部IBinder对象传递给Activity,并不会将Service的生命周期与Activity绑定

            bindService(new Intent(this, MyService.class), conn, BIND_AUTO_CREATE);//所以,此时调用unBindService方法取消绑定后,Service不会调用onDestroy方法

            break;

        case 7:

            if (mIBinder != null) {

                mIBinder.callMethodInService(100);

            } else {

                Toast.makeText(this, "还没有绑定呦……", Toast.LENGTH_SHORT).show();

            }

            break;

        }

    }

    private class MyServiceConnection implements ServiceConnection {//Interface for monitoring监控 the state of an application service         @Override         /**此方法中的IBinder即为我们调用bindService方法时Service的onBind方法返回的对象,我们可以在此方法回调后通过这个IBinder与Service进行通信 */         public void onServiceConnected(ComponentName name, IBinder service) {//访问者与Service连接成功时回调              //Called when a connection连接 to the Service has been established确定、已建立, with the IBinder of the communication channel to the Service.             mIBinder = (IBinderInterface) service;             Toast.makeText(MainActivity.this, "服务已连接……", Toast.LENGTH_SHORT).show();         }         @Override         public void onServiceDisconnected(ComponentName name) {//异常终止或者其他原因终止导致Service与访问者断开连接时回调             Toast.makeText(MainActivity.this, "服务已断开连接……", Toast.LENGTH_SHORT).show();         }     } }

Service


public class MyService extends Service {

    @Override

    public void onCreate() {

        Log.i("bqt", "onCreate");

        super.onCreate();

    }

    @Override

    public IBinder onBind(Intent intent) {//如果再次使用bindService绑定Service,系统不会再调用onBind()方法,而是直接把IBinder对象传递给其他后来增加的客户端

        Log.i("bqt", "onBind");

        return new MyBinder();//当访问者通过bindService方法与Service连接成功后,系统会将此返回的IBinder接口类型对象,通过bindService中的参数ServiceConnection对象的onServiceConnected方法,传递给访问者,访问者通过该对象便可以与Service组件进行通信

    }

    @Override

    public void onRebind(Intent intent) {

        super.onRebind(intent);

        Log.i("bqt", "onRebind");

    }

    @Override

    public int onStartCommand(Intent intent, int flags, int startId) {//客户端每次调用startService方法时都会回调此方法;调用bindService时不会回调此方法

        Log.i("bqt", "onStartCommand");

        return super.onStartCommand(intent, flags, startId);

    }

    @Override

    public boolean onUnbind(Intent intent) {//绑定多客户端情况下,需要解除所有的绑定后才会(就会)调用onDestoryed方法,除非service也被startService()方法开启

        Log.i("bqt", "onUnbind");

        return super.onUnbind(intent);

    }

    @Override

    public void onDestroy() {

        Log.i("bqt", "onDestroy");

        super.onDestroy();

    }

    //******************************************************************************************

    /**这是服务里面的一个方法,对外是隐藏的,只能通过IBinder间接访问*/

    private void methodInService() {

        Toast.makeText(this, "服务里的方法被调用了……", Toast.LENGTH_SHORT).show();

    }

    private class MyBinder extends Binder implements IBinderInterface {//须实现IBinder接口或继承Binder类。对外是隐藏的。

        public void callMethodInService(int money) {

            if (money > 0) {

                methodInService();//间接调用了服务中的方法

            }

        }

    }

}

联系Activity和Service的中间接口


public interface IBinderInterface {

    public void callMethodInService(int money);

}

清单文件


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.bqt.service"

    android:versionCode="1"

    android:versionName="1.0" >

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="17" />

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name=".MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <service android:name=".MyService" >

            <intent-filter>

                <action android:name="com.bqt.service.TEST_SERVICE" />

            </intent-filter>

        </service>

    </application>

</manifest>

来自为知笔记(Wiz)

时间: 2024-10-21 10:47:25

服务 Service 基本介绍的相关文章

Android服务Service总结

转自 http://blog.csdn.net/liuhe688/article/details/6874378 富貴必從勤苦得,男兒須讀五車書.唐.杜甫<柏學士茅屋> 作为程序员的我们,须知富贵是要通过勤苦努力才能得到的,要想在行业内有所建树,就必须刻苦学习和钻研. 今天我们来讲一下Android中Service的相关内容. Service在Android中和Activity是属于同一级别上的组件,我们可以将他们认为是两个好哥们,Activity仪表不凡,迷倒万千少女,经常做一些公众人物角色

Android服务——Service

服务 Service 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件.服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行. 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC). 例如,服务可以处理网络事务.播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行. 服务基本上分为两种形式: 启动 当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于"启动"状态

WebService服务调用方法介绍

1 背景概述 由于在项目中需要多次调用webservice服务,本文主要总结了一下java调用WebService常见的6种方式,即:四种框架的五种调用方法以及使用AEAI ESB进行调用的方法. 2 预期读者 数通畅联内部员工 广大计算机爱好者 3 名词解释 Web Service也叫XML Web Service: WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是通过SOAP在Web上提供的软件服务,使用WSDL

三十四、Linux系统任务计划cron、chkconfig工具、systemd管理服务、unit介绍

三十四.Linux系统任务计划cron.chkconfig工具.systemd管理服务.unit介绍.target介绍 一.Linux系统任务计划cron crontab命令:对任务计划功能的操作用此命令.选项: -u:指定某个用户,不加-u则为当前用户. -e:制定任务计划. -l:列出任务计划. -r:删除任务计划. 任务计划的配置文件:/etc/crontab 文件内共有五个字段. 从左往右依次为:分.时.日.月.周.用户.命令. 可以不指定用户就是root. # crontab -e  

Linux crond任务调度 磁盘分区和挂载 网络环境 进程管理 服务(service)管理 动态监控进程 rpm和yum

crond任务调度 1.基本语法 1.crontab [选项] -e : bianji crontab定时任务 -l : 查询crontab -r : 删除当前用户所有的crontab任务2.编辑模式:时间格式 命令或脚本路径 参数说明 示例: 例子: 每分钟执行查看一次/ect目录,把目录内容写进/tml/a.txt下 具体实现步骤: 1.crontab -e 2.*/1 * * * * ls -l /etc >> /tmp/a.txt 3.保存退出 上述权限示例 Linux 磁盘分区.挂载

android开发教程之开机启动服务service示例

个例子实现的功能是:1,安装程序后看的一个Activity程序界面,里面有个按钮,点击按钮就会启动一个Service服务,此时在设置程序管理里面会看的有个Activity和一个Service服务运行2,如果手机关机重启,会触发你的程序里面的Service服务,当然,手机启动后是看不到你的程序界面.好比手机里面自带的闹钟功能,手机重启看不到闹钟设置界面只是启动服务,时间到了,闹钟就好响铃提醒. 程序代码是: 首先要有一个用于开机启动的Activity,给你们的按钮设置OnClickListener

安卓第十三天笔记-服务(Service)

安卓第十三天笔记-服务(Service) Servcie服务 1.服务概念 服务 windows 服务没有界面,一直运行在后台, 运行在独立的一个进程里面 android 服务没有界面,一直运行在后台,默认是运行当前的应用程序进程里面. 2.建立服务 建立一个类继承Service类 public class ServiceDemo extends Service { 在清单文件中注册service <service android:name="com.ithiema.servicequic

Android - 位置定位(Location)服务(Service)类的基本操作

位置定位(Location)服务(Service)类的基本操作 本文地址: http://blog.csdn.net/caroline_wendy 定位服务,可以确定移动设备的地址,在地图相关服务中,经常会使用GPS和移动相关的定位服务,GPS较为精准. 根据常用的定位服务功能,又添加网络检测和Wifi检测,和启动相关界面进行测试的功能. 代码: import android.content.Context; import android.content.Intent; import andro

Android 查看服务service是否正在运行 列出正在运行的服务

在启动服务service或者停止服务service之前,需要先判断服务是否正在运行,再决定是否启动或停止服务,启动之前如果已经启动,会造成系统资源不必要的浪费,结束之前没有启动,则会使程序异常.下面是一个判断服务是否正在运行的方法,传入参数一个是调用该方法的Activity的context,另一个是完整的服务名,包括包名. 1 public boolean isRunning(Context c,String serviceName) 2 { 3 ActivityManager myAM=(Ac