第三十四天Service、IntentService、Thread、AsyncTask

Service、IntentService(不同在于:IntentService自身包含一个线程,还包含消息队列)

Service、IntentService的注册
 <service android:name=".MyService"></service>
 <service android:name=".MyIntentService"></service>

MainActivity

public class MainActivity extends Activity implements View.OnClickListener{
    private Button mButtonStart;
    private Button mButtonStop;
    private Button mButtonDownLoad;
    private ProgressBar mProgressBar;
    private IntentFilter mFilter;
    private DownLoadReceiver mReceiver;
    public  static  final  String DOWN_LOAD_ACTION="android.receiver";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButtonStart= (Button) findViewById(R.id.button_start);
        mButtonStop= (Button) findViewById(R.id.button_stop);
        mButtonDownLoad= (Button) findViewById(R.id.button_download);
        mProgressBar= (ProgressBar) findViewById(R.id.progressBar);
        mButtonStart.setOnClickListener(this);
        mButtonStop.setOnClickListener(this);
        mButtonDownLoad.setOnClickListener(this);

        mFilter=new IntentFilter();
        mFilter.addAction(DOWN_LOAD_ACTION);
        mReceiver=new DownLoadReceiver();
        registerReceiver(mReceiver,mFilter);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button_start:
                Intent intent=new Intent(getApplicationContext(),MyService.class);
                startService(intent);
                break;
            case R.id.button_stop:
                Intent intent1=new Intent(getApplicationContext(),MyService.class);
               // Intent intent1=new Intent(getApplicationContext(),MyIntentService.class);//启动IntentService
                stopService(intent1);
                break;
            case R.id.button_download:
                Intent intent2=new Intent(getApplicationContext(),MyService.class);
               // Intent intent2=new Intent(getApplicationContext(),MyIntentService.class);//启动IntentService
                startService(intent2);
                break;
            default:
                break;
        }

    }
   class DownLoadReceiver extends BroadcastReceiver{
       @Override
       public void onReceive(Context context, Intent intent) {
           int count=intent.getIntExtra("count",0);
           mProgressBar.setProgress(count);
       }
   }
}

MyService:(关闭服务后,程序仍在后台运行)

public class MyService extends Service {
    private  int count=0;
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("service", "运行到onStartCommand");
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(count<100){
                    count++;
                    Intent intent=new Intent();
                    intent.setAction(MainActivity.DOWN_LOAD_ACTION);
                    intent.putExtra("count",count);
                    sendBroadcast(intent);
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onCreate() {
        Log.d("service", "运行到onCreate");
        super.onCreate();
    }
    @Override
    public void onDestroy() {
        Log.d("service", "运行到onDestroy");
        super.onDestroy();
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

MyIntentService:(关闭程序后,程序退出不再运行)

public class MyIntentService extends IntentService {
    int count=0;
    public MyIntentService(String name) {
        super(name);
    }

    public MyIntentService(){
        this("");
    }
    @Override
    public void onDestroy() {
        Log.d("IntentService","运行到onDestroy");
        super.onDestroy();
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("IntentService", "运行到IntentService");
        while (true) {
            if (count < 100) {
                count++;
                Intent intent3 = new Intent();
                intent3.setAction(MainActivity.DOWN_LOAD_ACTION);
                intent3.putExtra("count", count);
                sendBroadcast(intent3);
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

倒计时

1.使用handler完成线程间通讯:子线程向主线程传递信息
MainActivity(方法一)

public class MainActivity extends Activity {
    private Button mButton;
    public int count=60;
    public static final int COUNT_REDUCE=1;
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case COUNT_REDUCE:
                    String time= (String) msg.obj;
                    mButton.setText(time);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton= (Button) findViewById(R.id.button);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while(count>0){
                            count--;
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            // Message message=handler.obtainMessage();
                            Message message=new Message();
                            message.obj=count+"秒";
                            message.what=COUNT_REDUCE;
                            handler.sendMessage(message);
                        }
                    }
                }).start();
            }
        });
    }
}

MainActivity(方法二:部分代码)

private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case COUNT_REDUCE:
                   count--;
                    mButton.setText(count+"秒");
                    if(count>0){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        handler.sendEmptyMessage(COUNT_REDUCE);
                    }
                    break;
            }
        }
    };
    ...
    ...
     mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                handler.sendEmptyMessage(COUNT_REDUCE);
            }
        });

2.子线程接收主线程的消息
MainActivity

public class MainActivity extends Activity {
    private Button mButton;
    private Button mButton_msg;
    private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton= (Button) findViewById(R.id.button);
        mButton_msg= (Button) findViewById(R.id.button_msg);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyThread thread=new MyThread();
                thread.start();
            }
        });

        mButton_msg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                handler.sendEmptyMessage(0);
            }
        });
    }

    class MyThread extends Thread{
        @Override
        public void run() {
            Looper.prepare();
            handler=new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    Log.d("message","接收到消息");
                }
            };
            Looper.loop();
        }
    }
}

先点击“60秒”按钮,再点击“接收消息”按钮
这里写图片描述
这里写图片描述

AsyncTask

MainActivity

public class MainActivity extends Activity {
    private Button mButton;
    private ProgressBar mProgressBar;
    private int count=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton= (Button) findViewById(R.id.button);
        mProgressBar= (ProgressBar) findViewById(R.id.progressBar);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyTask task=new MyTask();
                task.execute("执行");
            }
        });
    }

    class MyTask extends AsyncTask<String,String,String>{

        @Override
        protected String doInBackground(String... strings) {
            while(count<101){
                count++;
                publishProgress(""+count);
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "完成";
        }

        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            int count=Integer.parseInt(values[0]);
            mProgressBar.setProgress(count);
        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            mButton.setText(s);
        }
    }
}

开始:
这里写图片描述
完成:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值