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的實現方法就可以做到同樣的效果。因為網上有很多相似功能,具體代碼將不做過多解釋,我會在項目上一一做注釋,源碼如下:
ExpandedBlockStart.gif 代码
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:terryyhl@gmail.com

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值