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( )方法。

相关推荐
深海呐4 小时前
Android AlertDialog圆角背景不生效的问题
android
ljl_jiaLiang4 小时前
android10 系统定制:增加应用使用数据埋点,应用使用时长统计
android·系统定制
花花鱼4 小时前
android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。
android
落落落sss5 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
消失的旧时光-19437 小时前
kotlin的密封类
android·开发语言·kotlin
服装学院的IT男9 小时前
【Android 13源码分析】WindowContainer窗口层级-4-Layer树
android
CCTV果冻爽10 小时前
Android 源码集成可卸载 APP
android
码农明明10 小时前
Android源码分析:从源头分析View事件的传递
android·操作系统·源码阅读
秋月霜风11 小时前
mariadb主从配置步骤
android·adb·mariadb
Python私教12 小时前
Python ORM 框架 SQLModel 快速入门教程
android·java·python