Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android小項目之---時間線程應用(附源碼)

Android小項目之---時間線程應用(附源碼)

編輯:Android開發實例

進程

  在Android 中,進程是應用程序的完整實現,而不是用戶通常了解的那樣。他們主要用途很簡單:
    • 提高穩定性和安全性,將不信任或者不穩定的代碼移動到其他進程。
    • 可將多個.apk 包運行在同一個進程裡減少系統開銷。
    • 幫助系統管理資源,將重要的代碼放在一個單獨的進程裡,這樣就可以單獨銷毀應用程序的其他部分。
  像前面描述的一樣,進程的屬性被用來控制那些有特殊應用組件運行的進程。注意這個屬性不能違反系統安全: 如果兩個.apk 包不能共享同一個用戶ID,卻試圖運行在通一個進程裡,這種情況是不被允許的,事實上系統將會創建兩個不同的進程。請查看安全相關文檔以獲取更多關於安全限制方面的信息。

線程

  每個進程包含一個或多個線程。多數情況下,Android 避免在進程裡創建多余的線程,除非它創建它自己的線程,我們應保持應用程序的單線程性。一個重要的結論就是所有呼叫實例, 廣播接收器, 以及服務的實例都是由這個進程裡運行的主線程創建的。注意新的線程不是為活動,廣播接收器,服務或者內容提供器實例創建:這些應用程序的組件在進程裡被實例化(除非另有說明,都在同一個進程處理),實際上是進程的主線程。這說明當系統調用時這些組件(包括服務)不需要進程遠距離或者封鎖操作(就像網絡呼叫或者計算循環),因為這將阻止進程中的所有其他組件。你可以使用標准的線程類或者Android 的HandlerThread 類去對其它線程執行遠程操作。這裡有一些關於創建線程規則的例外:
    • 呼叫IBinder 或者IBinder 實現的接口,如果該呼叫來自其他進程,你可以通過線程發送的IBinder 或者本地進程中的線程池呼叫它們,從進程的主線程呼叫是不可以的。特殊情況下,,呼叫一個服務的IBinder可以這樣處理。(雖然在服務裡呼叫方法在主線程裡已經完成。)這意味著IBinder 接口的實現必須要有一種線程安全的方法,這樣任意線程才能同時訪問它。
    • 呼叫由正在被調用的線程或者主線程以及IBinder 派發的內容提供器的主方法。被指定的方法在內容提供器的類裡有記錄。這意味著實現這些方法必須要有一種線程安全的模式,這樣任意其它線程同時可以訪問它。
    • 呼叫視圖以及由視圖裡正在運行的線程組成的子類。通常情況下,這會被作為進程的主線程,如果你創建一個線程並顯示一個窗口,那麼繼承的窗口視圖將從那個線程裡啟動。

  底層原理如上,項目小實例開始:

 

網上看了一些例子,有高手們是直接新建一個類,然後繼承Thread之生重寫run方法,這個項目我將采用第二種寫法,就是繼承直接用Activity去繼承implements Runnable如:public class testAnalogClock extends Activity implements Runnable  ,之後我們只要重寫Runnable的實現方法就可以做到同樣的效果。因為網上有很多相似功能,具體代碼將不做過多解釋,我會在項目上一一做注釋,源碼如下:   package cn.terry;

import java.util.Calendar;

import android.app.Activity; 
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.*;
//使用線程實現的TextView 時鐘需要線程Thread、Handler(發送、處理消息)輔助實現
public class testAnalogClock extends Activity implements Runnable{
    private AnalogClock myAnalogClock;
    private TextView myTextView;
    private Thread mThread;
    private Handler myHandler;
    private Calendar myCalendar;  //日曆類
     protected static final int msg_Key = 0x1234;
     private int mHour, mMinutest,mScond; 
     
      
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
         
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //模擬時鐘的實現不需要額外代碼,只需要UI 中添加,其自動顯示時間
        myAnalogClock=(AnalogClock)findViewById(R.id.AnalogClock01);
        myTextView=(TextView)findViewById(R.id.TextView01); 
        
        
        /* 通過Handler 來接收進程所傳遞的信息並更新TextView */
        myHandler=new Handler()
        {
            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                switch (msg.what) {
                case testAnalogClock.msg_Key:
                    if(mMinutest==60)
                    {
                        mHour =1;
                        mMinutest=0;
                    }
                    if(mScond==60)
                    {
                        mMinutest =1; 
                    }
                    /* 在這處理要TextView對象Show時間的事件*/
                    myTextView.setText("    " mHour ":" mMinutest ":" mScond);
                    myTextView.setTextColor(Color.RED);
                    break;

                default:
                    break;
                }
                super.handleMessage(msg);
            }
        };
        /* 通過進程來持續取得系統時間*/
        mThread=new Thread(this);
        mThread.start();
        
    }
     
    /* 實現一個Runable接口,實例化一個進程對象, 用來持續取得系統時間*/
    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            do
            {
                long Time=System.currentTimeMillis();
                myCalendar=Calendar.getInstance();
                myCalendar.setTimeInMillis(Time);
                mHour=myCalendar.get(Calendar.HOUR);
                mMinutest=myCalendar.get(Calendar.MINUTE);
                mScond=myCalendar.get(Calendar.SECOND);
                Thread.sleep(1000);
                
                
                /* 重要關鍵程序:取得時間後發出信息給Handler */
                Message msg=new Message();
                msg.what=testAnalogClock.msg_Key;
                myHandler.sendMessage(msg);/* 重要關鍵程序:取得時間後發出信息給Handler */
            }
            while(Thread.interrupted()==false);/* 當系統發出中斷信息時停止本循環*/
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        
    }
   
}


 

 

如果你有什麽疑問或者建議可以 QQ:285735942 或 Email:[email protected] 源碼下載:/Files/TerryBlog/testAnalogClock.rar
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved