首页 > 代码库 > 安卓基础

安卓基础

1.  Service 服务 (是一个没有用户界面的在后台运行执行耗时操作的应用组件

第一种方式: (startService 未绑定, 当程序退出,若没有停止服务则会继续在后台运行)

//继承 Service
public class MyService extends Service {
    private String tag = "MyService";
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Log.i(tag , "onCreate");
    } 
}  

<!-- 清单中声明 -->
<service android:name=".MyService"></service>

//开启服务
intent = new Intent(this, MyService.class);
startService(intent);

//停止服务
stopService(intent);

第二种方式: (绑定服务)

//继承 Service
public class MyService extends Service {
    private String tag = "MyService";
    
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return new MyBind();
    }
    
    public class MyBind extends Binder implements IServices {
        @Override
        public void test() {
            myTest();
        } 
    }
    
    private void myTest() {
        Log.i(tag"test in service");
    }
}

//binder 中的接口 
public interface IServices {
    void test();
}

//开启服务
intent = new Intent(this, MyService.class);
bindService(intentconn , Context.BIND_AUTO_CREATE);
mIsBound = true;

if (mIsBound) {
    unbindService(conn);
}

private ServiceConnection conn = new ServiceConnection() {
    
    @Override
    public void onServiceDisconnected(ComponentName name) {
    }
    
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        iServices = (IServices)service;
        Log.i(tag"onServiceConnected");
    }
};

//调用服务中的函数
public void onTest(View view) {
    iServices.test();
}

远程调用Service

调用其他程序提供的Service, 其用到了aidl技术.  其他和调用本地无异. 只需将interface 的 public 修饰符去掉即可, 后缀改为aidl.
编译器将自动在gen目录下生成相应的.java 文件, 其中的Stub 子类实现了接口.

服务端:
//aidl 接口定义
interface IServices {
    void test();
}  

public class RemoteService extends Service {
    private String tag = "RemoteService";
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return new MyBinder();
    }
    private class MyBinder extends IServices.Stub{
        @Override
        public void test() throws RemoteException {
            myTest();
        }
    }
    
    private void myTest() {
        Log.i(tag"test in service");
    }
}

<!-- 清单注册,并添加action -->
<service android:name=".RemoteService">
    <intent-filter >
        <action android:name="cn.lt.RemoteService"/>
    </intent-filter>
</service>  

在调用端我们需要添加其服务端定义的aidl到工程中,其包名需要和服务端的一致.

private IServices iServices;  

//绑定
Intent intent = new Intent();
intent.setAction("cn.lt.RemoteService");
bindService(intent, new MyConn(), BIND_AUTO_CREATE); 

private class MyConn implements ServiceConnection {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        iServices = IServices.Stub.asInterface(service); 
    }
    @Override
    public void onServiceDisconnected(ComponentName name) {
    }   
}   

//调用服务中的函数
iServices.test();



2.  Java 反射机制 (是一个没有用户界面的在后台运行执行耗时操作的应用组件

Class 类

Class 类为 Java 反射的源头, 通过该类能得到一个类的完整结构. (在android 开发中, 可通过反射机制得到系统中隐藏的服务.
//反射测试类
public class Person {
    public Person(){};
    public static void sayHello() {
        System.out.println("Hello World");
    }
    
    public void sayHello(String name) {
        System.out.println("Hello "+name);
    }
    
    public int add(int a, int b) {
        return a+b;
    }
}

//---------------------------------
public static void main(String[] args) {
    try {
        //得到 Person 类对象 
        Class c = Class.forName("cn.lt.Test.Person");
        //得到 sayHello 方法
        Method method1 = c.getMethod("sayHello");
        method1.invoke(null);    //调用静态方法可传null
        Method method2 = c.getMethod("sayHello", String.class);    
        method2.invoke(c.newInstance(), new Object[]{"Ty"});
        Method method3 = c.getMethod("add"int.classint.class);    
        System.out.println(method3.invoke(c.newInstance(), new Object[]{1, 2})); 
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


















来自为知笔记(Wiz)