轉自 http://www.cnblogs.com/xiaoluo501395377/p/3430542.html
本篇隨筆將講解一下Android的多線程的知識,以及如何通過AsyncTask機制來實現線程之間的通信。
一、Android當中的多線程
轉自 http://www.cnblogs.com/xiaoluo501395377/p/3430542.html
本篇隨筆將講解一下Android的多線程的知識,以及如何通過AsyncTask機制來實現線程之間的通信。
一、Android當中的多線程
ToggleButton(開關按鈕)是Android系統中比較簡單的一個組件,是一個具有選中和未選擇狀態雙狀態的按鈕,並且需要為不同的狀態設置不同的顯示文本。
ToggleButton常用的XML屬性
要做一個Service要先了解,service無法自己啟動,必須要靠startService()才能啟動。
同樣的啟動後也必須要使用stopService()關閉。
在這邊需要注意的有幾點
1) startService()
2) stopService()
3) AndroidManiFest.xml增加service權限
第一點為開啟service必要條件,當然你要new一個intent
所以就是:
Intent intent = new Intent(MainActivity.this,service_class.class);
startService(intent);
MainActivity為你目前的class,service_class則是另外開的java檔(那邊則是寫service做的事情)
第二點跟第一點很類似,只有差在start / stop的差別
Intent intent = new Intent(MainActivity.this,service_class.class);
stopService(intent);
第三點就是你需要在Android ManiFest.xml裡面新增權限
否則跑起來會有
"
"
這樣的錯誤訊息出現
好了,總結上面 MainActivity該如何寫?
package com.example.service_nonui_demo;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this,service_class.class);
startService(intent);
}
@Override
public void onPause(){
super.onPause();
Intent intent = new Intent(MainActivity.this,service_class.class);
stopService(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}
}
之前提及過,啟動Service有兩種方式:startService 與 bindService。前者已經說過如何使用,所以,這篇貼子主要是關於 bind service的。 這裡所討論的是僅針對那些被綁定的service的,而那些既被startService() 又被 bindService() 的 service 不在此範圍內。
1 Bind Service就像是C/S架構中的服務端,其他組件(比如 Activity)綁定到它(通過 bindService()),可以向它發送請求,可以接受從它返回的響應,它甚至還提供了進程間通信(IPC)功能。
2 一個service要想能夠被其他組件綁定,那麼它的 onBind() 方法必須被實現,且必須返回一個 IBinder 對象,然後其他組件可以通過這個 IBinder 對象與該 service 進行通訊。
不管是何種Service,它默認都是在應用程序的主線程(亦即UI線程)中運行的。所以,如果你的Service將要運行非常耗時或者可能被阻塞的操作時,你的應用程序將會被掛起,甚至會出現ANR錯誤。為了避免這一問題,你應該在Service中重新啟動一個新的線程來進行這些操作。現有兩種方法共大家參考:
1 直接在Service的onStartCommand()方法中重啟一個線程來執行,如:
我們有兩種方式(start與bind)啟動一個Service,每一種方式啟動的Service生命週期是不一樣的,這篇貼子主要寫的是 start service。
它的生命週期中只有三個階段:onCreate, onStartCommand(取代原來的onStart方法), onDestroy。如下圖:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"ForceAutoLogon"="1"
If you have ever done system administration, you probably have the problem where you connect to so many servers that you have no idea which computer you are connected to half the time. BGInfo is a great utility that lets you display useful system information right on the desktop. And it works for regular Windows users as well.