Service(續)
###IntentService 每次只執行一個服務,其餘服務等待,適合後臺耗時操作
public class MyIntentService extends IntentService{
private int count=0;
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public MyIntentService(String name) {
super(name);
}
public MyIntentService() {
this("");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d("intentService", "運行到IntentService ");
while (count<100){
count++;
Intent intent2=new Intent();
intent2.setAction(MainActivity.DOWN_LOAN_ACTION);
intent2.putExtra("count",count);
sendBroadcast(intent2);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void onDestroy() {
Log.d("", "onDestroy ");
super.onDestroy();
}
}
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/progressBar"
android:layout_gravity="center_horizontal"
android:progress="0"/>
<Button
android:id="@+id/button_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="開始下載"/>
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("", "onStartCommand ");
new Thread(new Runnable() {
@Override
public void run() {
while (count<100){
count++;
Intent intent=new Intent();
intent.setAction(MainActivity.DOWN_LOAN_ACTION);
intent.putExtra("count",count);
sendBroadcast(intent);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
mProgressBar= (ProgressBar) findViewById(R.id.progressBar);
myDownloadReceiver=new MyDownloadReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction(DOWN_LOAN_ACTION);
registerReceiver(myDownloadReceiver,filter);
class MyDownloadReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int count=intent.getIntExtra("count",0);
mProgressBar.setProgress(count);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myDownloadReceiver);
}
}
UI主線程
###主界面只能由主線程來操作,子線程不允許
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
android:orientation="horizontal">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="倒計時"/>
<Button
android:id="@+id/button_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="60秒"/>
<Button
android:id="@+id/button_tochild"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="發送消息給子線程"/>
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private Button mButtonBack;
private Button mButtonTochild;
private int count=60;
private static final int TIME_DESC=123;
private Handler handler=new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case TIME_DESC:
count--;
mButtonBack.setText(count+"秒");
if (count>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(TIME_DESC);
}
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonBack= (Button) findViewById(R.id.button_back);
mButtonBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
handler.sendEmptyMessage(TIME_DESC);
}
}).start();
}
});
mButtonTochild= (Button) findViewById(R.id.button_tochild);
mButtonTochild.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyThread thread=new MyThread();
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.handlerTochild.sendEmptyMessage(0);
}
});
}
class MyThread extends Thread{
private Handler handlerTochild;
@Override
public void run() {
Looper.prepare();
handlerTochild=new Handler(){
@Override
public void handleMessage(Message msg) {
Log.d("handleMessage ", "接收到了主線程發來的消息 ");
}
};
Looper.loop();
}
}
}
AsyncTask(UI主線程)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
android:orientation="vertical">
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/progressBar" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="開始下載"/>
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private Button mButton;
private ProgressBar mProgressBar;
private int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgressBar= (ProgressBar) findViewById(R.id.progressBar);
mButton= (Button) findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyTask myTask=new MyTask();
myTask.execute("開始下載");
}
});
}
class MyTask extends AsyncTask<String,String,String>{
@Override
protected String doInBackground(String... params) {
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);
}
}
}