Android之Context、this


context不是函數而是一個類——如果不太了解面向對象,可以把“類”看做一種數據類型,就像int,不過類型為“類”的數據(稱為對象)可能儲存遠比int多的信息,比如這里的類型為Context的對象就儲存關於程序、窗口的一些資源。

 

 

 

有些函數調用時需要一個Context參數,比如Toast.makeText,因為函數需要知道是在哪個界面中顯示的Toast。

 

再比如,ButtonmyButton = new Button(this); 這里也需要Context參數(this),表示這個按鈕是在“this”這個屏幕中顯示的。

 

Android開發使用(純粹的)面向對象語言,一切都是對象,就連我們寫的函數都是對象的函數。

 

public class MainActivity extends Activity{

 

   @Override

 

   public void onCreate(Bundle savedInstanceState) {

 

 

 

       super.onCreate(savedInstanceState);

 

       setContentView(R.layout.activity_main);

 

       Toast.makeText(this,

 

                "OK!",

 

                Toast.LENGTH_LONG).show();

 

       Button button1 = (Button)findViewById(R.id.button1);

 

       button1.setOnClickListener(new Button.OnClickListener(){

 

           public void onClick(View v)

 

           {

 

               Toast.makeText(MainActivity.this,

 

                        "Hello, world!",

 

                       Toast.LENGTH_LONG).show();

 

           }

 

       });

 

    }

 

}

 

這里OnCreate就是MainActivity的對象的函數(MainActivity是類),所以這個函數中的this就表示當前的、包含這個函數的MainActivity對象。

 

MainActivity extends Activity,意思是MainActivity 繼承 Activity,即MainActivity 是 Activity 的一種,所有的MainActivity 都是 Activity。同樣,在Android文檔中Activity繼承ContextThemeWrapper,ContextThemeWrapper繼承ContextWrapper,ContextWrapper繼承Context。所以this這個MainActivity也是Context,把this傳入Toast.makeText表示“OK!”是在當前的MainActivity對象(也是Context)中顯示的。

 

對於顯示"Hello,world!"的Toast.makeText,這個函數在onClick中,而onClick是new Button.OnClickListener(){...}這個沒有名字的類的函數,this表示匿名類的對象,不表示MainActivity對象,所以這里用MainActivity.this,強制選擇外面一層MainActivity的this。

在activity和 service中使用的this,的確可以代替context,因為activity和service本身就是繼承於context類的,也就是說,那里面的this,就是一個context。

 

 

 

再來說上面這個context為什么不能用。因為toast是一個view,每一個view被添加的時候都需要一個token,activity中的context就包含了當前activity窗口的token,所以能夠使用,而onReceive中的context,並不是隸屬於某個應用程序進程的,而是屬於系統的context,所以這里會報錯。

//這里為什么將this替換成為context 是因為此類繼承自BroadcastReceiver  //並非繼承自Activity activity繼承自context activity.this可以當做一個context //而BroadcastReceiver直接繼承自Object 它的this不再屬於context,不能當做上下文,成為函數的參數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM