android(服务)-13
来源:互联网 发布:广州网络布线工程 编辑:程序博客网 时间:2024/05/21 18:43
第说到服务(service)就感觉很神奇,它与后台,多线程,进程什么的各种联系。总之服务是个好东西,我看不到他,但他却在工作,这让我想到了一个默默工作的劳动者,比如 。。。
服务第一个要说的就是线程,java开启一个线程并不是很难的事情,不过我是不记得怎么写了。。。
android里线程应该是这么写的吧
线程启动也有两种,一种显示的,一种匿名的方式:
class MyThread extends Thread{ @Override public void run(){ }}MyThread myThread = new MyThread();new Thread(myThread).start();
new Thread(new Runnable() { @Override public void run() { // }}).start();和各种GUI库一样,ui的更新都有一个安全的问题,就是必须在主线程中进行,跨线程都是会出异常的。
更新UI可以用一个message的方法来进行:
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="ouyang.myapplication.MainActivity"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/change_text" android:text="change text" android:layout_width="368dp" android:layout_height="wrap_content" tools:layout_editor_absoluteY="0dp" tools:layout_editor_absoluteX="8dp" /></android.support.constraint.ConstraintLayout>我们用一个按键来改变显示TextView的字符:
public class MainActivity extends AppCompatActivity { public static final int UPDATE_TEXT = 1; private TextView text; private Button changeText; private Handler handler = new Handler(){ public void handleMessage(Message msg){ switch(msg.what){ case UPDATE_TEXT: text.setText("在这主线程更新ui操作了"); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView)findViewById(R.id.text); changeText = (Button)findViewById(R.id.change_text); changeText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()){ case R.id.change_text: new Thread(new Runnable() { @Override public void run() { Message message = new Message(); message.what = UPDATE_TEXT; handler.sendMessage(message); } }).start(); break; default: break; } } }); }}这样就可以改变了。
解析异步消息处理机制
android中的异步处理主要由四部分级成:
Message:线程之间传递消息。
Handler:用于发送和处理消息
MessageQueue:用于存放消息
Looper:每个线程中的MessageQueue管家。
使用AsyncTask:一个封装了异步消息机制;
用时要先继承,有三个参数
Params要传入的参数
Progress进度单位
Result指定泛型作为返回值类型
一个最单位的自定义AsyncTask写成如下方式:
class DownLoadTask extends AsyncTask<Void, Integer, Boolean>{
}
经常需要去重写的方法
onPreExecute()开始前调用,用于进行界面上的初始化操作
doInBackground(Params...)所有代码都会在子线程中运行
onProgressUpdate(Progress...)对UI进行操作
onPostExecute(Result)利用返回的数据进行一些UI操作。
我搞一个下载任务玩玩
class DownloadTask extends AsyncTask<Void, Integer, Boolean> { @Override protected void onPreExecute(){ progreDialog.show(); } @Override protected Boolean doInBackground(Void...params){ try{ while (true){ int downloadPercent = doDownload();//虚构的方法 publishProgress(downloadPercent); if(downloadPercent >= 100){ break; } } }catch (Exception e){ return false; } return true; } @Override protected void onPostExecute(Boolean result){ progressDialog.setMessage("Downloaded" + values[0] + "%"); } @Override protected void onPostExecute(Boolean result){ progressDialog.dismiss(); if(result){ Toast.makeText(context, "Download succeeded", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(context, "Download failed", Toast.LENGTH_SHORT).show(); } }}启动只要写个
new DownloadTask().execute();
搞了关天还没搞到服务上去,想说句蛋蛋的,又到了开饭时间了饿死了。。。
服务这是四大级件之一当然要从基本用法开始了:
首先定义一个服务:
public class Myservice extends Service{ @Override public IBinder onBind(Intent intent){ return null; } @Override public void onCreate(){ super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId){ return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy(){ super.onDestroy(); }}四大组件都需要在AndroidManifest.xml注册才能使用:
<service android:name=".Myservice"></service>这样一个服务就定义好了。
启动与停止服务:
画两按键:
<Button android:id="@+id/start_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="start service" /><Button android:id="@+id/stop_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="stop service" />写监听
public class MainActivity extends Activity implements View.OnClickListener{ private Button startService; private Button stopService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startService = (Button)findViewById(R.id.start_service); stopService = (Button)findViewById(R.id.stop_service); startService.setOnClickListener(this); stopService.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.start_service: Intent startIntent = new Intent(MainActivity.this, Myservice.class); startService(startIntent); break; case R.id.stop_service: Intent stopIntent = new Intent(MainActivity.this, Myservice.class); stopService(stopIntent); break; default: break; } }}这样就可以停止启动服务了(注意 活动后要加
)否则不能用匿名的方式了。public class MainActivity extends Activity implements View.OnClickListener
- android(服务)-13
- android Services(服务)
- Android Service(服务)
- Android服务(Service)
- Android 服务(Service)
- Android之服务(四)前台服务
- Android---服务(Service)的绑定服务
- android 服务(service)开发
- Android基础-Service(服务)
- Android Service 服务 (一)
- Android Service 服务(二)
- Android学习(18)-服务
- Android--声音服务(AudioManager)
- Android 服务(二)BindService
- Android之Service(服务)
- android 系统服务(service)
- android系统服务(service)
- android之Service(服务)
- js中a标签跳转问题(参数隐藏问题以及href和target的冲突问题)
- Android OrmLite框架的简单使用
- python下放置模块问题
- android 自定义view之概述(一)
- vim-移动光标
- android(服务)-13
- 路由器
- ElasticSearch 5.0.0 安装部署常见错误或问题
- Jquery跨域请求(可以直接复制过来粘贴即可)
- jQuery each遍历数据组,json,对象
- 去除LIST中的重复对象
- 银联pinBlock加密算法的实现
- Swift将图片保存到沙盒下
- OpenCV进行图像相似度对比的几种办法