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

相关推荐
duwei_wang31 分钟前
[Android]-Admob配置过多导致的慢消息
android
雨白2 小时前
发送自定义广播
android
雨白2 小时前
深入理解广播机制 (BroadcastReceiver)
android
婵鸣空啼6 小时前
GD图像处理与SESSiON
android
sunly_7 小时前
Flutter:导航固定背景图,滚动时导航颜色渐变
android·javascript·flutter
用户2018792831678 小时前
简单了解android.permission.MEDIA_CONTENT_CONTROL权限
android
_一条咸鱼_8 小时前
Android Runtime类卸载条件与资源回收策略(29)
android·面试·android jetpack
顾林海8 小时前
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
android·面试·性能优化
砖厂小工8 小时前
Now In Android 精讲 8 - Gradle build-logic 现代构建逻辑组织方式
android
玲小珑8 小时前
Auto.js 入门指南(八)高级控件与 UI 自动化
android·前端