android四大组件——service学习总结

前言:android四大组件分别为:Activity 、BroadCast、Service、Contentprovider,他们默认情况下都是在相同的进程和主线程中。Activity是直接与用户交互的界面,Sevice其实就是没有界面的Activity。

1. 进程和线程的概念

在学习Service(服务)之前首先要明确进程和线程的概念

1.1 一个程序默认情况下只有一个进程,并且这个进程在创建的时候会默认创建一个线程,就是主线程,即 UI线程(Android是基于Linux的,所以一个安卓的进程其实就一个Linux进程,一般而言一个应用app就是一个安卓进程,也就是一个jvm虚拟机)。

1.2 默认情况下所有组件(四大组件)都是运行在相同的进程和主线程中

通过在清单文件中指定
android:process 来安排不同的组件运行在不同进程中

1.3 进程可以开启其它的子线程,线程是程序执行的最小单位

1.4 进程的优先级:

1.Foreground process:前台进程,最重要的进程,用户当前正在使用的进程,比如Activity调用onResume方法,或者广播调用onReceive()方法

2.Visible process :可视进程 比如Activity调用onPause方法  

3.Service process: 服务进程,用户看不见,但是在后台做一些事情比如播放音乐或者下载数据

4.Background process :后台进程,比如Activity调用onStop 停止     

5.Empty process : 空进程,没有任何组件在运行了 优先级最低

2. 服务的开启与停止(见案例ServiceTest)

2.1 如下图:在activity中添加两个按钮”开启服务” “停止服务”
点击开启服务按钮的时候调用startservice() 会走oncreat() onstart() 然后再多次点击”开启服务”会多次调用startservice(),只会走onstart(),调用stopservice(),会走ondestroy()
注意一定要在清单文件中注册服务

这里写图片描述

当点击返回键,退出界面时activity被销毁 ,但是服务任然还存在与进程中,所以这个进程为后台进程(因为服务还在运行,)之前有activity界面显示着,进程为前台进程。
假如这个activity中没有开启服务,那么退出界面activity被销毁,这个进程就为空进程了。

MainActivity中的代码如下:

public class MainActivity extends AppCompatActivity {

private Intent mIntent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

public void startSever(View view){
    mIntent = new Intent(this,MyService.class);
    startService(mIntent);//调用此方法开启服务

}

public void stopServer(View view){
    stopService(mIntent);//调用此方法停止服务
}
}

service中的代码

public class MyService extends Service {

public MyService() {
}

@Override
public void onCreate() {
    System.out.println("---->onCreate()");

}

@Override
/**
 * 内部调用了onStart()
 */
public int onStartCommand(Intent intent, int flags, int startId) {
    System.out.println("---->onStartCommand(Intent intent, int flags, int startId)");
    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
    System.out.println("---->onDestroy()");
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}
}

3.开启服务和开启子线程的区别(ThreadTest)

3.1 举例说明:当在新建一个项目,在mainactivity中开启一个子线程,在子线程中不断请求网络,当退出activity时,这个进程就为空进程,空进程很容易被回收,回收之后线程里的操作就会被停止(因为进程是线程的载体)
这里写图片描述

同理,如果再mainactivity中不开子线程,而是开启一个服务,把不断请求网络的操作放在服务中,那样activity退出后,这个进程就会变为后台进程,一下将优先级提上了级别3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值