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
)否则不能用匿名的方式了。




0 0
原创粉丝点击