Android开发从0开始(服务)

Android后台运行的解决方案,不需要交互,长期运行。

服务基础框架

public class MyService extends Service {

public MyService() {   

}

    @Override

public IBinder onBind(Intent intent) {

    //activity与service交互(需要继承)

        // TODO: Return the communication channel to the service.

        throw new UnsupportedOperationException("Not yet implemented");

    }

    public void onCreate(){

        //创建服务时定义

        super.onCreate();   }

    public int onStartCommand(Intent intent,int flags,int startId)

    {

        //启动服务时调用

        return super.onStartCommand(intent,flags,startId);

    }

    public void onDestroy(){

        //销毁服务时调用

        super.onDestroy();

}   }

Android多线程

方法一:

①继承Thread,重写run()方法

Class MyThread extends Thread{

Public void run( ){ // 处理具体的逻辑}

}

②启动线程,new  MyThread( ).start( );

方法二:                           

①使用Runable 接口定义线程

Class MyThread implements Runnable{

Public void run( ) {// 处理具体的逻辑 }

}

②启动线程,

MyThread myThread = new MyYhread( );

New Thread(my Thread ).start( );

匿名类简写:

在子线程中更新UI

  如果直接在子线程中修改UI会导致系统崩溃,因为UI线程是不安全的。所以采用异步消息处理机制。示例:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    public  static final int UPDATE_TEXT=1;

    private TextView text;

    private Handler handler = new Handler(){

      public void  handleMessage(Message msg)

      {

          switch (msg.what){

              case UPDATE_TEXT:

                  //UI修改部分

                  text.setText("NICE TO MEET YOU");

                  break;

              default:

                  break;     }       }        };

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        text = (TextView) findViewById(R.id.text);

        Button changeText= (Button) findViewById(R.id.change_text);

        changeText.setOnClickListener(this);

    }

    @Override

    public void onClick(View v) {

        if (v.getId() == R.id.change_text) {

            new Thread(new Runnable() {

                @Override

                public void run() {

                    Message message = new Message();

                    message.what = UPDATE_TEXT;

                    handler.sendMessage(message);

                }

            }).start();

        }

    }

}

异步消息处理机制:主要由4个部分组成:Message、Handler、MessageQueue和Looper。

Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交

换数据。上一小节中我们使用到了Message的what字段,除此之外还可以使用arg1和arg2字段来携带一些整型数据,使用obj字段携带一个 object对象。

Handler顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消息一般是

使用Handler 的sendMessage()方法, 而发出的消息经过一- 系列地辗转处理后,最终会传递到Handler的handleMessage()方法中。

MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个MessageQueue对象。

Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到

一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中。每个线程中也只会有一个Looper对象。

异步消息封装工具AsyncTask:

 AsyncTask抽象类,需要子类继承,一共三个泛型

简单定义AsyncTask:

Class DownloadTask extends AsynTask<Void, Integer, Boolean >{....}

这里我们把AsyncTask的第-一个泛 型参数指定为Void,表示在执行AsyncTask的时候不需

要传人参数给后台任务。第二个泛型参数指定为Integer,表示使用整型数据来作为进度显示单位。第三个泛型参数指定为Boolean, 则表示使用布尔型数据来反馈执行结果。

经常需要重写onPreExecute( ),doInBackground(params.. ),

 onProgressUpdate(params.. ),  onPostExecute(Result)

前台服务:会一直有一个正在运行的图标在系统状态栏显示。

IntentService类封装了自动开启线程调用stopSelf( )方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/214219.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter基础和概念

JMeter 介绍&#xff1a; 一个非常优秀的开源的性能测试工具。 优点&#xff1a;你用着用着就会发现它的重多优点&#xff0c;当然不足点也会呈现出来。 从性能工具的原理划分&#xff1a; Jmeter工具和其他性能工具在原理上完全一致&#xff0c;工具包含4个部分&#xff1a; …

干货!ERP软件如何帮助企业实现信息化管理?

ERP即企业资源规划&#xff08;Enterprise Resource Planning&#xff09;系统&#xff0c;其核心是物料的追踪流转。而在物料追踪流转的基础上&#xff0c;又衍生出一系列各类资源计划的管理和追踪。因此ERP发展成为一款集成各类资源计划&#xff0c;也就是集成企业核心业务流…

SRM供应商、采购管理系统

前言&#xff1a; 随着互联网和数字技术的不断发展&#xff0c;企业采购管理逐渐走向数字化和智能化。数字化采购平台作为企业采购管理的新模式&#xff0c;能够提高采购效率、降低采购成本、优化供应商合作效率&#xff0c;已成为企业实现效益提升的关键手段。 软件开发资料…

11.7统一功能处理

一.登录拦截器 1.实现一个普通的类,实现HeadlerInterceptor接口,重写preHeadler方法. 2.将拦截器添加到配置中,并设定拦截规则. 二.访问前缀添加 方法1: 方法2:properties 三.统一异常处理 以上返回的是空指针异常,如果是别的异常就不会识别,建议加上最终异常 . 四.统一数据格…

【LeetCode】每日一题 2023_11_24 统计和小于目标的下标对数目(暴力/双指针)

文章目录 刷题前唠嗑题目&#xff1a;统计和小于目标的下标对数目题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;统计和小于目标的下标对数目 题目链接&#xff1a;2824. 统计和小于目标的下标对数…

测试设备的选型

随着科技的不断发展和进步&#xff0c;各行各业都在积极地进行产业升级和转型。在这个过程中&#xff0c;各种测试设备发挥着不可或缺的作用。如何选择合适的测试设备&#xff0c;成为了企业生产过程中必须面对的重要问题。本文将探讨测试设备的选型&#xff0c;为企业提供一些…

PLC通过RS232转PROFINET与电子分析天平秤通讯案例

本案例是通过用兴达易控的XD-PNR200型RS232转Profinet网关连接电子分析天平秤与PLC通讯的配置案例&#xff0c;用到设备为西门子S7-1200PLC&#xff0c;RS232转Profinet网关&#xff0c;电子分析天平秤。 打开博图&#xff0c;添加PLC&#xff1b;本案例使用的是1200PLC。 添加…

Modbus RTU转Profinet网关连接PLC与变频器通讯在机床上应用案例

背景&#xff1a;以前在机床加工车间里&#xff0c;工人们忙碌地操作着各种机床设备。为了使整个生产过程更加高效、流畅&#xff0c;进行智能化改造。 方案&#xff1a;在机床上&#xff0c;PLC通过Modbus RTU转Profinet网关连接变频器进行通讯&#xff1a;PLC作为整个生产线…

Python大语言模型实战-记录一次用ChatDev框架实现爬虫任务的完整过程

1、模型选择&#xff1a;GPT4 2、需求&#xff1a;在win10操作系统环境下&#xff0c;基于python3.10解释器&#xff0c;爬取豆瓣电影Top250的相关信息&#xff0c;包括电影详情链接&#xff0c;图片链接&#xff0c;影片中文名&#xff0c;影片外国名&#xff0c;评分&#x…

微信小程序埋点

使用如下代码封装一下&#xff0c;例如封装在log.js文件里面&#xff1a; var log wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : nullmodule.exports {debug() {if (!log) returnlog.debug.apply(log, arguments)},info() {if (!log) returnlog.info.apply(l…

2023年ESG投资研究报告

第一章 ESG投资概况 1.1 定义 ESG投资&#xff0c;亦称负责任投资&#xff0c;是一种融合环境&#xff08;Environment&#xff09;、社会&#xff08;Social&#xff09;和治理&#xff08;Governance&#xff09;考量的投资方法&#xff0c;旨在通过综合这些因素来优化投资…

算法:给出指定整数区间、期望值,得到最终结果

1&#xff0c;问题&#xff1a; 在游戏中&#xff0c;我们经常会遇到以下情况&#xff1a;打开宝箱&#xff0c;获得x个卡牌碎片。 但通常策划只会给一个既定的数值空间&#xff0c;和一个期望得到的值&#xff0c;然后让我们去随机。比如&#xff1a; 问题A&#xff1a;在1~…