有关Context,this,getBaseContext()问题(整理)

来源:互联网 发布:apache怎么读 编辑:程序博客网 时间:2024/04/19 08:47

getApplicationContext() 返回应用的上下文,生命周期是整个应用,应用摧毁它才摧毁Activity.this的context 返回当前activity的上下文,属于activity ,activity 摧毁他就摧毁getBaseContext()  返回由构造函数指定或setBaseContext()设置的上下文this.getApplicationContext()取的是这个应 用程序的Context,Activity.this取的是这个Activity的Context,这两者的生命周期是不同 的,前者的生命周期是整个应用,后者的生命周期只是它所在的Activity。

在开发Android的过程中,总是能遇见Context类或者它的实例。Context类的实例经常被用来提供“应用程序”的引用。例如下面的代码片段,Toast类的第一个参数接受一个Context对象:


[java]
@Override 
    protected Dialog onCreateDialog(int id) { 
        switch (id) { 
        case 0: 
 
            Builder builder = new AlertDialog.Builder(this); 
            builder.setIcon(R.drawable.ic_launcher); 
            builder.setTitle("This is a dialog with some simple text..."); 
            builder.setPositiveButton("OK", 
                    new DialogInterface.OnClickListener() { 
                        public void onClick(DialogInterface dialog, 
                                int whichButton) { 
                            Toast.makeText(getBaseContext(), "OK clicked!", 
                                    Toast.LENGTH_SHORT).show(); 
                        } 
                    }); 
 
            builder.setNegativeButton("Cancel", 
                    new DialogInterface.OnClickListener() { 
                        public void onClick(DialogInterface dialog, 
                                int whichButton) { 
                            Toast.makeText(getBaseContext(), "Cancel clicked!", 
                                    Toast.LENGTH_SHORT).show(); 
                        } 
                    }); 
 
            builder.setMultiChoiceItems(items, itemsChecked, 
                    new DialogInterface.OnMultiChoiceClickListener() { 
                        public void onClick(DialogInterface dialog, int which, 
                                boolean isChecked) { 
                            Toast.makeText( 
                                    getBaseContext(), 
                                    items[which] 
                                            + (isChecked ? " checked!" 
                                                    : " unchecked!"), 
                                    Toast.LENGTH_SHORT).show(); 
                        } 
                    }); 
            return builder.create(); 
 
        } 
        return null; 
    } 
@Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case 0:

            Builder builder = new AlertDialog.Builder(this);
            builder.setIcon(R.drawable.ic_launcher);
            builder.setTitle("This is a dialog with some simple text...");
            builder.setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,
                                int whichButton) {
                            Toast.makeText(getBaseContext(), "OK clicked!",
                                    Toast.LENGTH_SHORT).show();
                        }
                    });

            builder.setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,
                                int whichButton) {
                            Toast.makeText(getBaseContext(), "Cancel clicked!",
                                    Toast.LENGTH_SHORT).show();
                        }
                    });

            builder.setMultiChoiceItems(items, itemsChecked,
                    new DialogInterface.OnMultiChoiceClickListener() {
                        public void onClick(DialogInterface dialog, int which,
                                boolean isChecked) {
                            Toast.makeText(
                                    getBaseContext(),
                                    items[which]
                                            + (isChecked ? " checked!"
                                                    : " unchecked!"),
                                    Toast.LENGTH_SHORT).show();
                        }
                    });
            return builder.create();

        }
        return null;
    }
    然而,Toast类并没有直接用在Activity中,它被用在了AlertDialog类中。所以,这里需要通过getBaseContext()方法获取一个Context类的实例。

    在Activity中动态地创建一个视图的时候也会遇见Context。例如,如果想通过硬编码动态地创建一个TextView:


[java]
TextView tv = new TextView(this); 
TextView tv = new TextView(this);    TextView的构造器接受一个Context对象,因为Activity类是Context类的子类,所以可以用this关键字来代替这个Conext对象。

 

提示:

    使用this动态地创建视图,例如TextView、Button,存在一个潜在的风险——内存泄漏。所以,尽可能地使用getApplicationContext()方法替代this。

0 0
原创粉丝点击