Android学习笔记之Service学习笔记

Service学习笔记

1.Service的生命周期

startService方式启动:
OnCreate --> OnStartComment --> OnDestroy

bindService方式启动:
OnCreate --> OnBind --> OnUnbind --> OnDestroy

先启动后绑定方式启动Service
OnCreate --> OnStartComment --> OnBind --> OnUnbind -- OnDestroy
如下小细节:
1.1 服务先启动后绑定(顺序可换),关闭服务时unbindService和stopService 必须连续执行

1.2 每次调用startService方法服务都会调用一次OnStartComment方法

1.3 运行中的服务仅能被绑定一次,解绑之后不能绑定

1.4 未绑定的服务解绑会抛出异常,绑定的服务解绑两次也会抛出异常

1.5 记得在Service方法中清理掉不需要的资源,防止Service停止后不再使用的对象继续占用内存

1.6 Service是运行在主线程中的,如果在Service中执行耗时操作一样会造成ANR,正确的耗时Service写法

```Java
public class MyBinder extends Binder {
    public void downLoad(){
        new Thread(){
            @Override
            public void run() {
                //do something...
            }
        }.start();
    }
}
@Override
public void onCreate() {
    new Thread(){
        @Override
        public void run() {
            //do something..
        }
    }.start();
}
```

1.7 前台Service。Service的优先级是比较低的,内容不足时系统可能会回收掉后台的Service,如果希望Service一直保持运行状态。可以使用前台Service。前台Service与普通Service的区别是,前台Service会一直有一个正在运行的图标在通知栏,非常类似通知效果。

```java
public void onCreate() {
     Intent intent = new Intent(this,MainActivity.class);
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
     Notification notification = new Notification.Builder(this)
            .setTicker("有新通知")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("通知标题")
            .setContentText("通知内容")
            .setWhen(System.currentTimeMillis())
            .setContentIntent(pendingIntent)
            .build();
            startForeground(1, notification);
    startForeground(1,notification);
}
```

2.服务与本地activity交互

2.1 自定义MyBinder类继承Binder对象,MyBinder类中调用服务中的方法 如上请看1.6

2.2 OnBind方法中返回MyBinder实例

     public IBinder onBind(Intent intent) {
          return  new MyBinder();
     }

2.3 Activity中定义MyBinder对象,用于接收MyBinder实例

    private MyService.MyBinder myBinder;

2.4 定义ServiceConnection匿名类,在OnServiceConnected方法中获取自定义binder对象
     public ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.e("TAG","onServiceConnected");
            myBinder = (MyService.MyBinder) iBinder;
2.5 调用MyBinder中的方法
            myBinder.downLoad();
        }
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.e("TAG","onServiceDisconnected");
        }
    };

3.调用远程Service,AIDL使用

    3.1 编写AIDL文件

    interface MyAIDLService {
        int getSum(int a,int b);
    }
    注意:AIDL接口中不能定义访问权限修饰符如public

    3.2 定义MyAIDLService.Stub()匿名类并实现其中方法,在onBind方法中返回 MyAIDLService.Stub()实例

        public IBinder onBind(Intent intent) {
            Log.e("TAG","OnBind");
            return  stub;
        }
        MyAIDLService.Stub stub = new MyAIDLService.Stub() {
            @Override
            public int getSum(int a, int b) throws RemoteException {
                return a+b;
            }
        };

    3.3 因为服务端没办法通过.class的方法获取要启动的Service,所以需要隐式启动Service,在配置文件中给服务端的Service添加action,服务端配置完毕
    <intent-filter>
    <action android:name="ihad.cc.androidstage01.MyAIDLService"/>
    </intent-filter>

    3.4 新建一个工程,copyAIDL文件及其所在包名到新工程,定义一个MyAIDLService对象接收实例,一个TextView显示结果

    MyAIDLService myService;
       public ServiceConnection conn = new ServiceConnection() {
           @Override
           public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                Log.e("TAG","onServiceConnected");
                myService = MyAIDLService.Stub.asInterface(iBinder);
                try {
                    int sum = myService.getSum(5,4);
                    Log.e("TAG",sum+"");
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
                    Log.e("TAG","onServiceDisconnected");
                }
        };

    3.5 定义一个button通过隐式意图访问服务
        public void onClick(View v) {
            Intent intent = new Intent("com.example.servicetest.MyAIDLService");
            bindService(intent, connection, BIND_AUTO_CREATE);
       }

注:本文很多内容来自郭霖的博客,附上地址:http://blog.csdn.net/guolin_blog/article/details/11952435

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为AI语言模型,我只能提供一些Android开发的基础知识和常用概念,希望对您有所帮助。 1. Android组成部分 Android操作系统由四个主要组成部分组成:应用程序、应用程序框架、系统运行库和硬件抽象层。 2. Activity Activity是Android应用程序中的一个组件,用于表示应用程序中的一个屏幕。Activity可以包含用户界面元素,如文本框、按钮和图像。 3. Intent Intent是Android应用程序中的一个基本组件,用于在不同的组件之间传递数据。Intent可以用于启动Activity、启动服务、发送广播等。 4. 布局 布局是Android应用程序中用于定义用户界面的XML文件。布局文件定义了应用程序中的视图层次结构,包括文本框、按钮、图像等。 5. AndroidManifest.xml AndroidManifest.xml是Android应用程序中的一个必需文件,用于描述应用程序的基本信息。该文件包含应用程序的包名、应用程序的入口Activity、应用程序需要的权限等信息。 6. 生命周期 Android应用程序中的每个组件都有自己的生命周期,包括创建、启动、暂停和销毁。了解组件的生命周期可以帮助开发者更好地管理应用程序的资源。 7. 线程 Android应用程序中的线程用于执行长时间运行的操作,如下载文件或执行计算。但是,在主线程中执行长时间运行的操作会导致应用程序变得缓慢或停止响应,因此必须使用异步线程。 8. Service ServiceAndroid应用程序中的一种组件,用于在后台执行长时间运行的操作。与Activity不同,Service没有用户界面,可以在后台执行。 9. 广播 广播是Android应用程序中的一种机制,用于在不同组件之间传递消息。广播可以用于通知应用程序中的其他组件,例如当设备电池电量低时,应用程序可以发送广播通知其他组件。 10. 内存管理 内存管理是Android应用程序中的一个重要方面。Android应用程序必须管理内存以确保应用程序能够正常运行,并避免出现内存泄漏和内存溢出等问题。可以使用垃圾回收器、使用合适的数据结构、避免创建不必要的对象等方法来管理内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值