android基础-服务

同样使用intent来传递服务

oncreate是服务第一次启动调用,onStartCommand是服务每次启动的时候调用,也就是说服务只要启动后就不会调用oncreate方法了。可以在myservice中的任何位置调用stopself方法让服务停止下来。

服务生命周期

前台服务类似于通知会有个图标在状态栏,为了防止被杀或回收,使用和通知一样的方式,变成前台服务

标准服务写法:

但有更加简洁的写法,不需要关注线程和服务停止,onHnadleIntent本身就在线程中,而且执行完成后会自动销毁。

补充:

1、前台进程:可以理解为是最顶部的,直接跟用户交互的。比如说我们操作的Activity界面.
2、可见进程:可以见的,但是不操作的,比如说我们在一个Activity的顶部弹出一个Dialog,这个Dialog就是前台进程,但是这个Activity则是可见进程。(操作的只是Dialog,而不是Activity但可见)
3、服务进程:服务可以理解为是忙碌的后台进程,虽然是在后台,但是它很忙碌。
4、后台进程:后台进程就是退隐到后台,不做事的进程。(比如按home键程序在后台但没有被干掉/)
5、空进程:空进程是不做事的,没有任何东西在上面跑着,仅作缓存作用。(比如按返回键退出此时就是空进程,销毁掉的进程就是空进程)
假设,内存不够用了,会先杀谁呢?
首先杀的是空进程,要是还不够就杀后台进程,要是还不够,那么就杀服务,但是服务被杀死以后,等内存够用了,服务又会跑起来了。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/ChenYiRan123456/article/details/123840817

绑定服务:

  1. Binder是IBinder的空实现类

OnBind是需要实现的,这里返回的是DownloadBinder中的实例。

红色框是向下转换,这样得到了downloadBinder的对对象,就可以去使用他们的方法了。

bindservice、startactivity等都是context的方式,直接用

看下如下的代码注释:

 
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
 
public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity-vv";
    private MyService.MyBinder mb;
    private ServiceConnection conn = new ServiceConnection() {
 
 
        //当客户端正常连接着服务时,执行服务的绑定操作会被调用
        //此时传来的IBinder对象是onbinder的返回的对象
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG, "onServiceConnected: ");
            //将IBinder对象转成MyBinder
            mb = (MyService.MyBinder) service;
            //调用MyBinder中的获取进度的方法:实现监控
            int process = mb.getProcess();
            Log.d(TAG, "当前进度是: " + process);
        }
 
        //当客户端和服务的连接丢失了
        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(TAG, "onServiceDisconnected: ");
 
        }
    };
 
    //IBinder
    //ServicerConnection:用于绑定客户端和Service
    //进度监控
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    /**
     * 按钮点击事件
     *
     * @param v
     */
    public void operate(View v) {
        switch (v.getId()) {
            case R.id.start:
                //启动服务:创建-->启动-->销毁
                //如果服务已经创建了,后续重复启动,操作的都是同一个服务,不会再重新创建了,除非你先销毁它
                Intent it1 = new Intent(this, MyService.class);
                startService(it1);
                break;
            case R.id.stop:
                Intent it2 = new Intent(this, MyService.class);
                stopService(it2);
                break;
            case R.id.bind:
                //绑定服务:最大的 作用是用来实现对Service执行的任务进行进度监控
                //如果服务不存在: onCreate-->onBind-->onUnbind-->onDestory
                // (此时服务没有再后台运行,并且它会随着Activity的摧毁而解绑并销毁)
                //服务已经存在:那么bindService方法只能使onBind方法被调用,而unbindService方法只能使onUnbind被调用
                Intent it3 = new Intent(this, MyService.class);
                bindService(it3, conn, BIND_AUTO_CREATE);
 
                break;
            case R.id.unbind:
                //解绑服务
                if (MyService.IsBinder)
                    unbindService(conn);
                break;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值