安卓基础

mac2022-06-30  26

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)

转载于:https://www.cnblogs.com/lv-2012/p/3766781.html

相关资源:Android零基础教程视频链接
最新回复(0)