1.什么是Service 还有关于service有几种启动方式?
Sevice是Android的四大组件之一和Activity的级别差不多
Service是长时间运行在后台的,是不可见,是没有运行界面的组件。
Service是运行在主线程中。
Service可以跨进程调用。
关于service共有三种启动方式分别是:
startService,bindService,IntentService 。
2.为什么要学Service
手机病毒是编程者在手机程序中插入的带破坏数据,吸费,监控等功能的代码,能够影响手机使用,能够自我复制的一组指令或者程序代码。
病毒的共性是拥有潜伏性,触发性,传染性,破坏性。
病毒都是偷偷地在后台执行预期的功能。
并且大部分的病毒都是通过Service的特点,可以不知不觉的完成预期的结果
3.如何使用Service
一.新建类继承Service
二.重写 onCreat方法(Service在创建时调用只能永爱数据的初始化,Service在没有停止之前,只会执行一次。)
三.实现onBlid抽象方法(由于Service是一个抽象类,定义一个onBlid抽象方法,所以必须实现一个抽象方法,return null即可,此时的方法在startService方式用不上,无需理会即可)
四.重写onStartCommand方法(Service创建后会调用onStartCommand此方法中可以接受,调用者传递过来的参数,并且可以编写需要的逻辑代码当重复调用时Service时onStartCommand会重复执行onStart方法已弃用)
五.重写onDestory方法
六.在AndroidManifes中注册service
七.再有context中启动startService启动Service
八.再有context中启动stopService停止Service
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.e("MAIN"+Thread.currentThread().getName(),"onCreate-----");
new Thread(new Runnable() {
@Override
public void run() {
for (int i =0;i<10;i++){
Log.e("Service"+Thread.currentThread().getName(),i+"*******");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("MAIN"+Thread.currentThread().getName(),"onStartCommand----");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("MAIN","onDestroy------");
}
}
关于startService的优缺点我们来讲一下
优点就是代码比较简单只需要几行代码就可以实现启动Service
缺点无法获得Service的对象。不能直接操作Service的属性和方法,只能通过Intent传递不同参数,重复调用startService,触发onStartCommand。
现在我们来介绍其中其二的启动方法bindService的启动方式。
对于步骤其实二者有些许不同之处在onCreate和onBind方法二者位置前后不相同
startService使用这种方法启动一个Service,在Service启动后该Service和启动该Service的Activity就没有关系了。但是这种发放启动的Service不能和Activity进行交互。
通常情况下使用startService调用的Service生命周期方法为:onCreate()->onStartCommand()。
其中多次调用startService只调用一次onCreate(), 但可以多次调用onStartCommand();
当服务需要退出时,调用stopService,就会调用Service的onDestroy()方法;**
对于bindService使用这种方法启动的Service是和调用者Activtiy同生命的,当Activtiy退出时,服务也同时销毁了。这种方法启动的Service能够和Activity进行交互。调用bindService启动服务,Service生命周期方法为:onCreate()->onBind()多次调用bindService并不会多次调用onBind(), 即onCreate()和onBind()都是只被调用一次。当Activity退出是,该Service销毁,调用:onUnbind()->onDestroy();**
对于 其他的不同位置就是他们的代码不同所造成的就上面的两个区别不同希望学习的各位注意一下
对于代码的展示我们在下面来展现
public class Myservice1 extends Service {
private MyBinder binder = new MyBinder();
private boolean stopFlag;
private int count;
private class MyBinder extends Binder {
public int getCount(){
return count;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e("MAIN","onBind------");
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
Log.e("MAIN","onUnbind------");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.e("MAIN","onCreate------");
// new Thread(new MyThread()).start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("执行onStartCommand方法");
//三种返回值(仅限使用startService方法启动时有效果)
//START_STICKY,服务被异常杀掉后,会重启服务
//START_NOT_STICKY,服务被异常杀掉后,不会重启服务
//START_REDELIVER_INTENT,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
Log.e("MAIN","onRebind---------");
}
@Override
public void onDestroy() {
super.onDestroy();
stopFlag = true;
Log.e("main","onDestroy-------------");
}
class MyThread extends Thread{
@Override
public void run() {
while(!stopFlag){
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"---"+Thread.currentThread().getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
System.out.println(count);
}
}
}
}
至于前面的Activity的代码我现在来展示
private Button button;
private Button button1;
private Button btn;
private String TAG = "ZhangSanActivity";
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder servic) {
Log.e(TAG, "onServiceConnected=========");
//通过管家的中介作用,获得TEstService对象
TestService testService = ((TestService.Guanjia) servic).getServiceObject();
testService.fly();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.e(TAG, "onServiceDisconnected=========");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_zhang_san);
blid();
}
private void blid() {
button = findViewById(R.id.btn1);
button1 = findViewById(R.id.btn2);
button.setOnClickListener(this);
button1.setOnClickListener(this);
btn = findViewById(R.id.tiao_btn);
btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn1:
Intent intent = new Intent(this,TestService.class);
bindService(intent,serviceConnection,BIND_AUTO_CREATE);
break;
case R.id.btn2:
unbindService((serviceConnection));
break;
case R.id.tiao_btn:
Intent intent1 = new Intent(ZhangSanActivity.this, LiSiActivity.class);
startActivity(intent1);
break;
}
}
}
对于Log打不出来我们要添加Service的添加项
<service android:name=".Myservice1" />
<service android:name=".MyIntentService"></service>
IntentService继承自Service,内部有一个HandlerThread对象。
在onCreate的时候会创建一个HandlerThread对象,并启动线程。紧接着创建ServiceHandler对象,ServiceHandler继承自Handler,用来处理消息。ServiceHandler将获取HandlerThread的Looper就可以开始正常工作了。
每启动一次onStart方法,就会把数消息和数据发给mServiceHandler,相当于发送了一次Message消息给HandlerThread的消息队列。mServiceHandler会把数据传个onHandleIntent方法,onHandleIntent是个抽象方法,需要在IntentService实现,所以每次onStart方法之后都会调用我们自己写的onHandleIntent方法去处理。处理完毕使用stopSelf通知HandlerThread已经处理完毕,HandlerThread继续观察消息队列,如果还有未执行玩的message则继续执行,否则结束。
并且在跳转页面之后有不同的页面而且在页面中就第一个页面为A第二个页面为B之后第一个页面的绑定和解除服务器只能够在这个以页面的按钮有用对于第二个页面就没有用。但是第一个绑定之后第二个页面的绑定一样可以使用,之后再第二个页面的解除就会报错因为不是这一个页面的所以他就是没有这个权限。
之后这就是bindService的启动方式现在我们来说说他们的优缺点
优点可以得到Service对象,灵活控制Service内部的属性和方法
缺点使用较为复杂。
对于IntentService的使用我们在下面的使用讲解一下
IntentService 是继承自 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作。
当任务执行完后,IntentService 会自动停止,不需要我们去手动结束。
如果启动 IntentService 多次,那么每一个耗时操作会以工作队列的方式在 IntentService 的 onHandleIntent 回调方法中执行,依次去执行,使用串行的方式,执行完自动结束。
public class MyIntentService extends IntentService {
public MyIntentService(String name) {
super(name);
}
public MyIntentService(){
super("");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
for (int i=0;i<10;i++){
try {
Log.e("MyIntentServic",i+"-------");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
在Activity的代码只要改一下就可以代码如下
switch (view.getId()) {
case R.id.btn1:
// Intent intent = new Intent(this,TestService.class);
// bindService(intent,serviceConnection,BIND_AUTO_CREATE);
Intent intent = new Intent(this, MyIntentService.class);
startService(intent);
这要修改这个就可以
好以上就是关于启动Service的方法