Service

1.什么是Service:
安卓四大组件之一,服务是在后台执行的一种任务,依赖于创建服务时的那个程序的进程,当这个进程被关闭时,后台服务也会关闭。
2.为什么要用Service:
用于安卓解决后台运行的问题,他不需要和用户进行交互,适合执行一些不需要和用户进行交互且需要进行长期运行的操作。
3.Service的启动方式;
共有两种:1.startService(Intent参数);
2.bindService(参数);
提示。需要在androidmanifest文件中先注册才行。

<service android:name=".myservice"/service>

4.startService的特点:
运行在后台的服务如果不需要和UI线程进行交互时调用。
回调的方法都是在主线程里执行,多次启动oncreate方法只会调用一次,而onstartcommand却是多次调用。
5.startService的使用示例:

public class MainActivity extends AppCompatActivity {
private Button bt1;
private Button bt2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt1=findViewById(R.id.bt1);
        bt2=findViewById(R.id.bt2);
        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent start=new Intent(MainActivity.this,service.class);
                //安卓5.0后规定Intent必须为显示的才可启动服务
                startService(start);//用startService启动服务
            }
        });
        bt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent stop=new Intent(MainActivity.this,service.class);
                stopService(stop);//stopService来停止服务
            }
        });
    }
}
public class service extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.e("ddc", "onBind: "+"###########################################" );
        return null;
    }
    @Override
    public void onCreate() {//服务启动时只调用一次,哪怕是多次启动,主要用于完成一些初始化操作。
        Log.e("ddc", "onCreate: "+"###########################################" );
        super.onCreate();
    }
    @Override
    public boolean onUnbind(Intent intent) {
        Log.e("ddc", "onUnbind: "+"###########################################" );
        return super.onUnbind(intent);
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {//可多次回调
            @Override
            public void run() {
                for(int i=0;i<=20;i++){
                    Log.e("dsd", "handleMessage: "+i +Thread.currentThread().getName()+"***************");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();

                }
                }
            }
        }).start();

        Log.e("ddc", "onStartCommand: "+"###########################################" );
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {//销毁服务
        Log.e("ddc", "onDestroy: "+"###########################################" );
        super.onDestroy();
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.zhang.service.MainActivity">

   <Button
    android:id="@+id/bt1"
       android:text="启动服务"
    android:layout_width="match_parent"
    android:layout_height="80dp" />

    <Button
        android:id="@+id/bt2"
        android:text="停止服务"
        android:layout_width="match_parent"
        android:layout_height="80dp" />

</LinearLayout>

6.bindService的特点:
两个不同进程间的通信或service被相同进程调用时
需要先在继承Service类里创一个内部类,再通过ServiceConnection对象在activty中创对象调用
7.bindService的使用示例:

public class Main2Activity extends AppCompatActivity {
private Button q1;
private Button q2;
    private Button q3;
    private ServiceConnection cn=new ServiceConnection() {//创ServiceConnection对象
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
service2 ser=((service2.guanjia)service).gets();//创继承Service类的对象
ser.fly(Main2Activity.this);//对类中方法的调用
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        q1=findViewById(R.id.q1);
        q2=findViewById(R.id.q2);
        q3=findViewById(R.id.q3);
        final Intent intent=new Intent(Main2Activity.this,service2.class);
        q1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
bindService(intent,cn, Service.BIND_AUTO_CREATE);//启动服务
            }
        });
        q2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
unbindService(cn);
            }
        });
        q3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent1=new Intent(Main2Activity.this,Main3Activity.class);
                startActivity(intent1);

       }
        });
    }
}
public class service2 extends Service {

    public guanjia binder=new guanjia();
    //得到service的对象
    public class guanjia extends Binder{

        public service2 gets(){
            return service2.this;
        }
    }

    public void fly(Context context){
        Toast.makeText(context,"fly",Toast.LENGTH_SHORT).show();
        Log.e("ygyg", "fly: "+"起飞" );
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.e("ssfr", "onBind: " );
        return binder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("thrh6h", "onCreate: rfr" );
    }

    @Override
    public boolean onUnbind(Intent intent) {

        Log.e("gfs", "onUnbind: jr7j7j" );
        return true;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("fhv", "onStartCommand: hdhvhdsvds" );
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
        Log.e("njn", "onRebind: jvsjvsdjvs" );
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("dsv", "onDestroy: " );
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.zhang.service.Main2Activity">


    <Button
        android:id="@+id/q1"
        android:text="启动服务"
        android:layout_width="match_parent"
        android:layout_height="80dp" />

    <Button
        android:id="@+id/q2"
        android:text="停止服务"
        android:layout_width="match_parent"
        android:layout_height="80dp" />
    <Button
        android:id="@+id/q3"
        android:text="天平座"
        android:layout_width="match_parent"
        android:layout_height="80dp" />
</LinearLayout>


8.IntentService的特点及优缺点:
intentservice内部采用HandleThread来执行任务,任务执行完毕后,intentservice会自动退出。多次启动服务时,intentservice会创出多个等待,排队一个一个处理
优点:intentservice自带一个工作线程,当需要做耗时操作时可以使用intentservice。任务完成后会自动停止

9.IntentService的使用示例:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.zhang.service.Main4Activity">


    <Button
        android:textSize="30dp"
        android:text="启动"
        android:id="@+id/bt"
        android:layout_width="match_parent"
        android:layout_height="80dp" />
</LinearLayout>
public class Intentservice extends IntentService{
    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
     * @param name Used to name the worker thread, important only for debugging.
     */
    public Intentservice(String name) {
        super(name);
    }
public Intentservice(){//必须建。不然注册时会报错
    super("");

}


    @Override
    protected void onHandleIntent(@Nullable Intent intent) {//内置线程
        for(int i=0;i<=5;i++){
            try {
                Thread.sleep(1000);
                Log.e("fvrer", "onHandleIntent: "+i );
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class Main4Activity extends AppCompatActivity {
private Button bt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
        bt=findViewById(R.id.bt);


        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {//启动服务
                Intent intent=new Intent(Main4Activity.this,Intentservice.class);

                startService(intent);
            }
        });
    }
}

10.IntentService和Service的区别:
service是运行在主线程中,会带来UI阻塞,所以在耗时操作时,会在onstartCommand中开启一个新线程,去执行耗时操作。
为了简化工作量,就提供了一个类intentservice,intentservice自带一个工作线程,当需要做耗时操作时可以使用intentservice,任务完成后会自动停止。intentservice是继承自service类。

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
08-10
### Service的生命周期和状态 Service在Android系统中可以分为两种主要状态:启动状态和绑定状态。当一个Service被启动后,它会在后台长时间运行,即使启动它的组件已经被销毁,Service仍然可以继续运行[^2]。如果一个Service既被启动又被绑定,那么它会同时处于这两种状态。 ### Service的生命周期方法 自定义的Service需要继承`Service`基类,并且通常需要重写一些生命周期方法来实现特定的功能: - `onCreate()`:当Service第一次创建时调用。如果Service已经存在,则不会调用此方法。 - `onStartCommand(Intent intent, int flags, int startId)`:当其他组件通过调用`startService()`方法请求启动Service时调用。在这个方法里可以处理长时间运行的操作。 - `onBind(Intent intent)`:当其他组件通过调用`bindService()`方法绑定到Service时调用。该方法返回一个`IBinder`接口,允许客户端与Service进行通信。 - `onUnbind(Intent intent)`:当所有绑定到Service的客户端都解绑后调用。 - `onDestroy()`:当Service不再使用并被销毁时调用。这是释放资源的好时机。 ### 启动状态下的Service 当一个Service通过调用`startService()`方法启动时,它进入启动状态。在这种状态下,Service独立于启动它的组件运行,直到它自己停止或被系统终止。要停止这样的Service,可以在Service内部调用`stopSelf()`方法,或者从外部组件调用`stopService()`方法[^1]。 ### 绑定状态下的Service 当组件通过调用`bindService()`方法绑定Service时,Service进入绑定状态。此时,组件可以通过`ServiceConnection`对象获取到Service提供的`IBinder`对象,从而与Service进行交互。绑定状态下的Service可以被多个组件绑定,只有当所有绑定的组件都解绑后,Service才会被销毁[^3]。 ### Service的声明 无论哪种类型的Service,都需要在`AndroidManifest.xml`文件中声明。声明格式如下: ```xml <service android:name=".Demo2Service" /> ``` 其中`.Demo2Service`是你的Service类名[^2]。 ### Service的绑定过程 为了与Service进行交互,组件需要创建一个`ServiceConnection`实例,并实现其`onServiceConnected()`和`onServiceDisconnected()`回调方法。例如: ```java private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // 这里 IBinder类型的service 就是我们要绑定的那个service // 通过这个service,Activity就可以调用MyBindService.MyBinder中的方法 } @Override public void onServiceDisconnected(ComponentName name) { Log.i(TAG, "onServiceDisconnected: "); } }; ``` 然后,组件可以通过调用`bindService()`方法来绑定Service,并在不需要时调用`unbindService()`方法来解绑[^5]。 ### Service的应用场景 Service非常适合用来执行那些不需要用户界面但需要长时间运行的任务。比如播放音乐、下载文件、处理网络请求等。此外,Service还可以与其他组件进行交互,包括跨进程通信(IPC)[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值