博客
关于我
Service与Activity之间通信
阅读量:271 次
发布时间:2019-03-01

本文共 4279 字,大约阅读时间需要 14 分钟。

如何在Android中使用Service实现背景任务处理在Android开发中,Service是一种非常重要的组件类,它允许我们在应用程序运行时执行长期的、甚至在主线程之外的操作。通过Service,我们可以实现从后台执行任务、管理资源、或与其他组件进行交互等功能。在本文中,我们将详细探讨如何使用Service实现一个下载管理器,并通过Activity与Service进行交互。首先,我们需要创建一个继承自Service的类,称为MsgService。这个类将负责管理下载任务,并提供相关的操作接口。 MsgService.java```javapublic class MsgService extends Service {    public static final int MAX_PROGRESS = 100;    private int progress = 0;    public int getProgress() {        return progress;    }    public void startDownload() {        new Thread(new Runnable() {            @Override            public void run() {                while (progress < MAX_PROGRESS) {                    progress += 5;                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }).start();    }    @Override    public IBinder onBind(Intent intent) {        return new MsgBinder();    }    public class MsgBinder extends Binder {        public MsgService getService() {            return MsgService.this;        }    }}

这个MsgService类中,定义了一个最大进度值MAX_PROGRESS,以及当前下载进度progress。类中提供了两个主要方法:getProgress()用来获取当前进度,以及startDownload()用来启动下载任务。此外,通过Binder接口,我们可以将Service与其他组件(如Activity)进行交互。

接下来,我们需要创建一个Activity来与MsgService进行交互。这个Activity将负责绑定Service、管理UI元素以及处理用户交互。

MainActivity.java

public class MainActivity extends AppCompatActivity {    private MsgService msgService;    private int progress = 0;    private ProgressBar mProgressBar;    private Button mButton;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 绑定Service        Intent intent = new Intent(this, MsgService.class);        bindService(intent, new ServiceConnection() {            @Override            public void onServiceDisconnected(ComponentName name) {                // Service已经解绑,进行相应的处理            }            @Override            public void onServiceConnected(ComponentName name, IBinder service) {                msgService = ((MsgService.MsgBinder) service).getService();            }        }, Context.BIND_AUTO_CREATE);        mProgressBar = findViewById(R.id.progressBar1);        mButton = findViewById(R.id.button1);        mButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                msgService.startDownload();                listenProgress();            }        });    }    @Override    protected void onDestroy() {        super.onDestroy();        unbindService(new ServiceConnection() {            @Override            public void onServiceDisconnected(ComponentName name) {                // Service已经解绑,进行相应的处理            }            @Override            public void onServiceConnected(ComponentName name, IBinder service) {                // 不需要处理            }        });    }    private void listenProgress() {        new Thread(new Runnable() {            @Override            public void run() {                while (progress < MsgService.MAX_PROGRESS) {                    progress = msgService.getProgress();                    try {                        Thread.sleep(1000);                        runOnUiThread(new Runnable() {                            @Override                            public void run() {                                Toast.makeText(MainActivity.this, "下载进度:" + progress, Toast.LENGTH_SHORT).show();                            }                        });                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }).start();    }}

在这个MainActivity中,我们首先绑定了MsgService,通过ServiceConnection接口监听Service的连接状态。当Service连接成功后,我们可以通过MsgBinder获取到MsgService实例。用户点击按钮后,会调用startDownload()方法,启动下载任务,并通过listenProgress()方法监听下载进度。

最后,我们需要在AndroidManifest.xml中注册MsgService,确保系统可以正确地启动和管理这个Service。

AndroidManifest.xml

通过以上代码和配置,我们成功创建并优化了一个Android Service应用,这个应用可以在后台执行下载任务,并通过UI元素反馈进度信息。这种设计模式在Android开发中非常常见,适用于需要长期运行或管理资源的场景。

转载地址:http://dfzo.baihongyu.com/

你可能感兴趣的文章
MySql 手动执行主从备份
查看>>
Mysql 批量修改四种方式效率对比(一)
查看>>
mysql 批量插入
查看>>
Mysql 报错 Field 'id' doesn't have a default value
查看>>
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
Mysql 拼接多个字段作为查询条件查询方法
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>
mysql 数据库存储引擎怎么选择?快来看看性能测试吧
查看>>
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
查看>>
MySQL 数据库的高可用性分析
查看>>
MySQL 数据库设计总结
查看>>
Mysql 数据库重置ID排序
查看>>
Mysql 数据类型一日期
查看>>
MySQL 数据类型和属性
查看>>