zoukankan      html  css  js  c++  java
  • Android基础(十) Service 服务

    1.什么时Service

        Service也是Android的四大组件之一。

        Service时一种可以长期在后台运行,没有界面的组件。由其他组件调用开始运行。

    2.定义Service

        需要定义一个类继承Service,而且要在清单文件AndroidManifest.xml定义<service>节点;如果需要使用隐式意图启动,还需要配置<intent-filter>和<action>。

    3.启动和停止Service

        调用startService()方法,并传入一个Intent对象可以启动Service。Service启动时会调用onCreate()和onStart()方法,而且onCreate()方法仅在第一次调用时执行。

        调用stopService()并传入一个Intent对象可以停止Service,停止时会调用onDestroy()方法。

        在Activity中也可以使用bindService(Intent intent)来开启一个服务,但是该Service会随着Activity的销毁而销毁。

    main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <Button
            android:id="@+id/startBT"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="开启服务" />
    
        <Button
            android:id="@+id/stopBT"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="停止服务" />
    
    </LinearLayout>
    public class MainActivity extends Activity {
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    	}
    
    	public void onClick(View view) {
    		Intent intent = new Intent(this, MyService.class);
    
    		switch (view.getId()) {
    		case R.id.startBT:
    			startService(intent);
    			break;
    		case R.id.stopBT:
    			stopService(intent);
    			break;
    		}
    	}
    }
    public class MyService extends Service {
    
    	private boolean isRunning;
    
    	@Override
    	public void onCreate() {// 创建时执行
    		super.onCreate();
    		System.out.println("onCreate");
    	}
    
    	@Override
    	public void onStart(Intent intent, int startId) {// 启动时执行
    		super.onStart(intent, startId);
    		System.out.println("onStart");
    
    		isRunning = true;
    
    		new Thread() {
    			public void run() {
    				for (int i = 0; isRunning; i++) {
    					System.out.println(Thread.currentThread().getName() + ":"
    							+ i);
    					try {
    						Thread.sleep(1000);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			};
    		}.start();
    	}
    
    	@Override
    	public void onDestroy() {// 停止时执行
    		super.onDestroy();
    		System.out.println("onDestroy");
    		isRunning = false;
    	}
    
    	@Override
    	public IBinder onBind(Intent intent) {// 绑定服务时执行
    		System.out.println("onBind");
    		return null;
    	}
    
    }
    
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.xxx.service"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk android:minSdkVersion="10" />
    
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <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"/>
        </application>
    
    </manifest>

    4.绑定本地Service

        使用bindService()方法来绑定服务,需要传入一个自定义的ServiceConnection用来接收IBinder

        定义一个业务接口,其中定义需要使用的方法

        Service中有一个IBinder继承Binder并实现业务接口,在onBind方法中返回

        调用端将IBinder转为接口类型,调用接口中的方法即可调用到服务中的方法。

    Activity调用Service中的方法示例:

    Activity调用Service中的方法

    Activity通过接口调用Service中的方法示例:

    Activity通过接口调用Service中的方法

    5.绑定远程Service(AIDL:Android Interface Definition Language)

        远程绑定服务时无法通过同一个接口来调用方法,这时就要使用AIDL技术

        将接口的扩展名改为.aidl,去掉所有的权限修饰符

        gen文件夹下会自动生成同名的接口

        将Service中自定义的IBinder类改为继承接口中的Stub

        ServiceConnection中返回的IBinder是代理对象,不能使用强制转换,而是要改用Stub.asInterface()

        aidl调用过程

  • 相关阅读:
    vue中的 computed 和 watch 的区别
    mysql8.0 初始化数据库及表名大小写问题
    sql server alwayson 调整数据文件路径
    zabbix 自定义监控 SQL Server
    mysql 创建用户及授权
    mysql 设置从库只读模式
    mysql8.0 主从复制安装及配置
    centos8.0安装mysql8.0
    centos8替换阿里数据源
    npm publish 报错 【you or one of your dependencies are requesting a package version that is forbidden by your security policy】
  • 原文地址:https://www.cnblogs.com/chenchong/p/3034465.html
Copyright © 2011-2022 走看看