Service

来源:互联网 发布:redis数据库设计java 编辑:程序博客网 时间:2024/06/05 04:45

什么是Service?

四大组件之一,后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事物,定义好需要接受的Intent提供同步和异步的接口。

Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?

默认情况,如果没有显示的指 servic 所运行的进程, Service 和 activity 是运行在当前 app 所在进程的 main thread(UI 主线程)里面。
service 里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 )
特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,让 service 在另外的进程中执行

<service    android:name="com.baidu.location.f"    android:enabled="true"    android:process=":remote" ></service>

Service 的启动方式有几种,Activity 怎么和 Service 绑定?

在 Activity 中可以通过 startService 和 bindService 方法启动 Service。一般情况下如果想获取Service 的服务对象那么肯定需要通过 bindService()方法,比如音乐播放器,第三方支付等。如果仅仅只是为了开启一个后台任务那么可以使用 startService()方法。
Activity 通过 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 进行绑定,当绑定成功的时候 Service 会将代理对象通过回调的形式传给 conn,这样我们就拿到了Service 提供的服务代理对象。

描述一下startService()和bindService()启动service 的生命周期有什么不同?

通过startService()启动服务:会调用如下生命周期方法:
onCreate()—->onStart()—->onDestory()

如果是调用bindService()启动服务:会调用如下生命周期方法:
onCreate()—->onBind—->onUnBind()—->onDestory()
不同:
当采用startService()方法启动服务,访问者与服务之间是没有绑定在一起的,访问者退出,服务还在运行,而采用bindService()方法启动服务时,访问者与服务是绑定在一起的,即访问者退出,服务也就终止,解除绑定。

什么是 IntentService?有何优点?

简介
IntentService 是 Service 的子类, 比普通的 Service 增加了额外的功能。 先看 Service 本身存在两个问题:
1、 Service 不会专门启动一条单独的进程,Service 与它所在应用位于同一个进
2、 Service 也不是专门一条新线程,因此不应该在 Service 中直接处理耗时的任务;
特征:
Acitivity的进程,当处理Intent的时候,会产生一个对应的Service; Android的进程处理器现在会尽可能的不kill掉你。
会创建独立的 worker 线程来处理所有的 Intent 请求;
会创建独立的 worker 线程来处理 onHandleIntent()方法实现的代码,无需处理多线程问题;
所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf()方法停止 Service;
为 Service 的 onBind()提供默认实现,返回 null;
为 Service 的 onStartCommand 提供默认实现,将请求 Intent 添加到队列中;

MainActivity.java:public void click(View view){    Intent intent = new Intent(this, MyIntentService.class);    intent.putExtra("start", "MyIntentService");    startService(intent);}MyIntentService.javapublic class MyIntentService extends IntentService {        private String ex = "";        private Handler mHandler = new Handler() {            public void handleMessage(android.os.Message msg) {                Toast.makeText(MyIntentService.this, "-e " + ex,                        Toast.LENGTH_LONG).show();            }        };        public MyIntentService() {            super("MyIntentService");        }        @Override        public int onStartCommand(Intent intent, int flags, int startId) {            ex = intent.getStringExtra("start");            return super.onStartCommand(intent, flags, startId);        }        @Override        protected void onHandleIntent(Intent intent) {/** * 模拟执行耗时任务 * 该方法是在子线程中执行的,因此需要用到 handler 跟主线程进行通信 */            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            mHandler.sendEmptyMessage(0);            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }

Activity、Intent、Service 是什么关系

其中 Activity 和 Service 都是 Android 四大组件之一。他俩都是 Context 类的子类 ContextWrapper 的子类。Activity 负责用户界面的显示和交互, Service 负责后台任务的处理。 Activity和 Service 之间可以通过 Intent 传递数据,因此可以把 Intent 看作是通信使者。

解释一下activity、 intent 、intent filter、service、BroadcastReceiver

activity呈现了一个用户可以操作的可视化用户界面;
service不包含可见的用户界面,而是在后台运行,可以与一个activity绑定,通过绑定暴露出来接口并与其进行通信;
BroadcastReceiver是一个接收广播消息并做出回应的组件,broadcast receiver没有界面;
intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI,Intent对象可以显式的指定一个目标组件。如果这样的话,android会找到这个组件(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳组件。它是通过将Intent对象和目标的intent filter相比较来完成这一工作的;一个组件的intent filter告诉android该组件能处理的intent。intent filter也是在manifest文件中声明的。

Service 和 Activity 在同一个线程吗

对于同一 app 来说默认情况下是在同一个线程中的,main Thread (UI Thread)。

Service 里面可以弹吐司么?

可以的。弹吐司有个条件就是得有一个 Context 上下文,而 Service 本身就是 Context 的子类,因此在 Service 里面弹吐司是完全可以的。 比如我们在 Service 中完成下载任务后可以弹一个吐司通知用户。
在 service 的生命周期方法 onstartConmand()可不可以执行网络操作?如何在 service 中执行网络操作?
可以直接在 Service 中执行网络操作,在 onStartCommand()方法中可以执行网络操作

Service和Thread的区别?

Service是系统的组件,它由系统进程托管(servicemanager)。Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。
Thread 是程序执行的最小单元,它是分配CPU的基本单位,是由本应用程序托管。可以用 Thread 来执行一些异步的操作。

在 service 的生命周期方法 onstartConmand()可不可以执行网络操作?如何在 service 中执行网络操作?

可以直接在 Service 中执行网络操作,在 onStartCommand()方法中可以执行网络操作

0 0