Android的Service和Thread的区别

Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。

Android Service是组件,既不能说它是单独的进程也不能说它是单独的线程。
如果非要从通俗的语言层面来理解的话,姑且将其理解为对象。这个Service对象本身作为应用程序的一部分与它的调用者运行在相同的进程,当然如果指定了process则会运行到另外的进程。指定到其他进程的方法参加Service属性的"android:process"。

Android Service可以在后台运行,不需要给用户提供任何的界面。但是Service是默认运行在主线程的,不要以为可以直接把它放在后台作耗时操作,如果要做耗时操作还是需要在Service里另起线程的,否则你懂得,会阻塞主线程造成ANR。
Service是组件:默认运行在当前进程的主线程中的,如果需要执行耗时操作,记得在Service里创建新线程;
Service用来提高优先级:在后台场景下,Service的优先级是高于后台挂起的Activity的,也高于Activity所创建的线程。这样的话,在内存不足时,Service不会被优先杀死


import android.content.Intent;
import android.os.IBinder;
import android.os.Message;
import android.support.annotation.Nullable;

import xx.MyApplication;
import xx.MySQLiteOpenHelper;
import xx.entity.UploadTaskEntity;
import xx.sharedpreference.SharedPreferenceConstant;

import java.lang.ref.WeakReference;

public class UploadTaskService extends android.app.Service {
    private MyHandler myHandler;
    private java.util.concurrent.ScheduledExecutorService scheduledExecutorService;
    private int timesForSuccess;
    private int timesForFailure;
    private int timesForNothing;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        android.util.Log.d("debug", "服务在绑定的时候");
        return new MyServiceBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        android.util.Log.d("debug", "服务在创建的时候");
        WeakReference<UploadTaskService> myServiceWeakReference = new WeakReference<UploadTaskService>(this);
        myHandler = new MyHandler(myServiceWeakReference);
        scheduledExecutorService = new java.util.concurrent.ScheduledThreadPoolExecutor(3, java.util.concurrent.Executors.defaultThreadFactory());
        java.util.concurrent.ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(new NetworkRunnable(), 10, 30, java.util.concurrent.TimeUnit.SECONDS);
        boolean isDone = scheduledFuture.isDone();
        android.util.Log.d("debug", "调度未来是否完成->" + isDone);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            android.content.ComponentName componentName = new android.content.ComponentName(this, UploadTaskService.class);
            android.content.Intent intent = new android.content.Intent();
            intent.setComponent(componentName);
            android.content.ComponentName componentNameResult = startForegroundService(intent);
            if (componentNameResult != null) {
                android.util.Log.d("debug", "开启前台服务返回的结果->" + componentNameResult.getShortClassName());
            }
            android.app.NotificationChannel notificationChannel = new android.app.NotificationChannel("persistent", "persistent", android.app.NotificationManager.IMPORTANCE_LOW);
            java.lang.Object objectNotificationManger = getSystemService(NOTIFICATION_SERVICE);
            if (objectNotificationManger instanceof android.app.NotificationManager) {
                android.app.NotificationManager notificationManager = (android.app.NotificationManager) objectNotificationManger;
                notificationManager.createNotificationChannel(notificationChannel);
                android.app.Notification notification = new android.support.v4.app.NotificationCompat.Builder(this, "persistent")
                        .setAutoCancel(true)
                        .setCategory(android.app.Notification.CATEGORY_SERVICE)
                        .setOngoing(true)
                        .setPriority(android.app.NotificationManager.IMPORTANCE_LOW)
                        .build();
                startForeground(10, notification);
            }
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null) {
            android.util.Log.d("debug", "服务在开始命令的时候(intent)->" + intent.getAction());
        }
        android.util.Log.d("debug", "服务在开始命令的时候(flags)->" + flags);
        android.util.Log.d("debug", "服务在开始命令的时候(startId)->" + startId);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        android.util.Log.d("debug", "服务在销毁的时候");
        scheduledExecutorService.shutdown();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        android.util.Log.d("debug", "服务在解绑的时候");
        return super.onUnbind(intent);
    }

    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
        android.util.Log.d("debug", "服务在重新绑定的时候");
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);
        android.util.Log.d("debug", "服务在任务移除的时候");
    }

    public void startNetwork() {
        android.util.Log.d("debug", "手动触发上传");
        Thread thread = new Thread(new NetworkRunnable());
        thread.setName("manualThread");
        thread.start();
    }

    public boolean getScheduledExecutorServiceIsShutDown() {
        return scheduledExecutorService.isShutdown();
    }

    public java.util.Properties getProperties() {
        java.util.Properties properties = new java.util.Properties();
        properties.put("timesForSuccess", timesForSuccess);
        properties.put("timesForFailure", timesForFailure);
        properties.put("timesForNothing", timesForNothing);
        return properties;
    }

    private void responseSuccessForNetwork(String result) {
        android.util.Log.d("debug", "异步任务响应成功->" + result);
        timesForSuccess ++;
    }

    private void responseFailureForNetwork(String result) {
        android.util.Log.d("debug", "异步任务响应失败->" + result);
        timesForFailure ++;
    }

    private void nothingResponse() {
        timesForNothing ++;
    }

    public class MyServiceBinder extends android.os.Binder {
        public UploadTaskService getMyService() {
            return UploadTaskService.this;
        }
    }

    protected static class MyHandler extends android.os.Handler {
        private final WeakReference<UploadTaskService> myServiceWeakReference;

        public MyHandler(WeakReference<UploadTaskService> myServiceWeakReference) {
            this.myServiceWeakReference = myServiceWeakReference;
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            UploadTaskService uploadTaskService = myServiceWeakReference.get();
            if (uploadTaskService != null) {
                String result = (String) msg.obj;
                if (msg.what == -1) {
                    uploadTaskService.nothingResponse();
                } else if (msg.what == 0) {
                    uploadTaskService.responseSuccessForNetwork(result);
                } else if (msg.what == 1) {
                    uploadTaskService.responseFailureForNetwork(result);
                }
            }
        }
    }

    protected class NetworkRunnable implements Runnable {

        @Override
        public void run() {
            android.app.Application application = getApplication();
            if (application == null) {
                return;
            }
            android.content.SharedPreferences sharedPreferencesMulti = getSharedPreferences(SharedPreferenceConstant.NAME, android.content.Context.MODE_MULTI_PROCESS);
            String authorization = sharedPreferencesMulti.getString(SharedPreferenceConstant.TOKEN, null);
            authorization = authorization == null ? "Bearer " : "Bearer " + authorization;
     
Android 开发中,Service Thread 是两个用于处理后台任务的机制,但它们在用途、生命周期适用场景上有显著的区别。 ### 1. **基本概念与用途** ServiceAndroid 的四大组件之一,它主要用于执行长时间运行的操作,并且可以在后台持续运行,即使用户切换了应用或者 Activity 被销毁。Service 通常用于执行不需要与用户界面直接交互的任务,例如播放音乐、下载文件或处理网络请求[^2]。 Thread 是 Java 中的基本线程类,用于实现并发操作。在 Android 中,Thread 通常用于执行耗时任务,以避免阻塞主线程(UI 线程),从而防止应用出现 ANR(Application Not Responding)错误[^4]。 ### 2. **生命周期管理** Service 的生命周期由系统管理,可以通过 `startService()` 或 `bindService()` 启动。当 Service 被启动后,它会在后台持续运行,直到它自己调用 `stopSelf()` 或者其他组件调用 `stopService()` 来停止它[^3]。 Thread 的生命周期则完全由开发者控制。一旦 Thread 的 `run()` 方法执行完毕,或者开发者主动调用 `interrupt()` 方法,Thread 就会终止。如果 Thread 的创建者(例如一个 Activity)被销毁,而 Thread 仍在运行,那么该 Thread 将继续执行,但无法再被控制,除非手动停止或程序进程被终止[^3]。 ### 3. **线程与进程模型** Service 本质上是一个组件,它默认运行在应用的主线程中,因此不能直接在 Service 中执行耗时操作,否则会导致主线程阻塞。通常会在 Service 中启动一个 Thread 来处理耗时任务[^2]。 Thread 则是一个独立的执行单元,它可以运行在自己的线程中,不会阻塞主线程。Thread 的运行是独立的,即使启动它的组件(如 Activity)被销毁,Thread 仍会继续执行,直到其任务完成或被显式中断[^3]。 ### 4. **跨组件通信与资源共享** Service 可以通过 `bindService()` 提供绑定接口,允许其他组件(如 Activity)与其进行通信交互。这种机制使得多个组件可以共享同一个 Service 实例,并对其进行控制。此外,Service 还可以通过 BroadcastReceiver 接收广播消息,从而实现更灵活的交互方式[^3]。 Thread 不具备跨组件通信的能力。Thread 的生命周期控制范围局限于创建它的组件。如果多个组件需要对同一个后台任务进行控制,Thread 无法满足这一需求,而 Service 则可以很好地解决这个问题[^3]。 ### 5. **适用场景** - **Service** 适用于需要长时间运行、跨组件控制的任务。例如,音乐播放器、后台数据同步服务等。 - **Thread** 适用于执行短期的、不需要跨组件控制的耗时任务。例如,图片加载、数据解析等。 ### 6. **代码示例** 以下是一个简单的 Thread 示例,用于执行耗时任务: ```java class MyThread extends Thread { @Override public void run() { try { sleep(3000); String s = "世界平"; Log.i("Thread方式收到的值是:", s); } catch (InterruptedException e) { e.printStackTrace(); } } } MyThread myThread = new MyThread(); myThread.start(); ``` 而 Service 的使用通常涉及以下几个步骤: ```java public class MyService extends Service { @Override public void onCreate() { super.onCreate(); // 初始化操作 } @Override public int onStartCommand(Intent intent, int flags, int startId) { // 执行后台任务 new Thread(new Runnable() { @Override public void run() { // 耗时操作 } }).start(); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); // 清理资源 } @Override public IBinder onBind(Intent intent) { return null; } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值