当前位置:首页 » 安卓系统 » android上下文

android上下文

发布时间: 2023-03-22 23:40:25

A. 自己关于Android上下文对象的理解

  Android中有个我们熟悉又陌生的对象Context(上下文),当我们启动Activity的时候需要上下文,当我们使用dialog的时候我们需要上下文,但是上下文对象到底是个什么东西呢?

  在Android api当中是这样描述context对象的。

"Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc."

“是一个用于实现关于应用环境的整体信息的一个接口。这是一个由安卓系统提供的抽象类并且系统有对他进行实现。它允许访问到应用特殊的资源和类,同时它也可以实现到应用级别的操作,例如:Activity的启动,广播的实现和接受intent等。”

一、Context的主要实现和继续理解

  知道了context的大概描述,我们可以再继续理解Context这个神秘的对象了,首先,作为基类,肯定有其它类去实现它,主要实现了context类的类是Activity,Service,Application。他们三个类虽然都是Context的子类,但是具体的继承关系却有些不大一样:

Activity的继承关系:

Service和Application的继承关系:

  可以看出我们的Context其实就是我们熟知的Activity,Service,Application。

  在这3个类中,Activity的context对象和Application的context对象最容易弄混淆。

二、Context中的主要方法

  知道了Context的大概描述和他的一些继承关系,我们对Context这个类有了一个大致的了解。现在可以看看在context中的一些方法,来加深对context的一个理解,有很多我们使用过的方法其实都是从Context这个类中实现而来。

  我们从Android api中查看Context类,这里出现了一个非常熟悉的方法:startActivity,可以看到其实Activity中的StartActivity方法是重写了Context中的方法。

abstract void startActivity ( Intent intent)

Same as startActivity(Intent, Bundle) with no options specified.

abstract void startActivity ( Intent intent, Bundle options)

Launch a new activity.

同时context还可以访问到资源文件,获得资源文件中的信息。

abstract Resources getResources ()

Return a Resources instance for your application's package.

abstract SharedPreferences getSharedPreferences ( String name, int mode)

Retrieve and hold the contents of the preferences file 'name', returning a SharedPreferences through which you can retrieve and modify its values.

final String getString (int resId)

Return a localized string from the application's package's default string table.

final String getString (int resId, Object... formatArgs)

Return a localized formatted string from the application's package's default string table, substituting the format arguments as defined in Formatter and format(String, Object...) .

同时context不但可以开启一个activity,同时还可以开启或者关闭一个Service。

abstract ComponentName startService ( Intent service)

Request that a given application service be started.

abstract boolean stopService ( Intent service)

Request that a given application service be stopped.

  访问Android Api 或者查看源码可以看到,Context中还有很多访问资源文件和程序之间互相通信的方法。

  可以看出context其实就是一个应用之中的手脚,可以通过他来拿取资源文件中的资源,还可以通过他来处理Activity和Service中的一些操作,这个类就是整个程序的枢纽,负责管理整个程序的通畅运行。

  我们可以通过分析一个Toast通知的源码去分析context的去向和使用,来了解context到底做了些神马操作:

public static Toast makeText(Context context, CharSequence text, int ration) {

   Toast result = new Toast(context);

   LayoutInflater inflate = (LayoutInflater)

   context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

   View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);

   TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);

   tv.setText(text);

   result.mNextView = v;

   result.mDuration = ration;

   return result;

}

可以看到makeText方法接受的context被用于

context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);

  这是用于获取XML中定义的View的方法,可以看到通过外部传入的Context,在这里获得了一个View布局用于显示Toast。

public Toast(Context context) {

   mContext = context;

   mTN = new TN();

   mTN.mY = context.getResources().getDimensionPixelSize(

   com.android.internal.R.dimen.toast_y_offset);

   mTN.mGravity = context.getResources().getInteger(

   com.android.internal.R.integer.config_toastDefaultGravity);

}

  这一行中可以看出在context又被用来获取资源文件,可以看出Toast的显示和布局都是通过context去调用系统写好的资源文件来进行实现的。

三、Activity context和Application context的区别

  Activity的context和Application的context的区别在于生命周期的区别,Activity的context是依附在着Activity的生命周期的,而Application的Context的生命周期是依附在整个应用之上的。

B. 如何理解android中的上下文对象(Context对象)

Context,中文直译为“上下文”,SDK中对其说明如下:
Interface to global information about an application environment. This is an abstract class whose implementation
is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls
for application-level operations such as launching activities, broadcasting and receiving intents, etc。
从上可知一下三点,即:

1、它描述的是一个应用程序环境的信息,即上下文。
2、该枯纤类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到亩茄是ContextIml类)。
3、通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一迅败察个Activity,发送广播,接受Intent信息等。

C. android中能否有两个opengl上下文

不能。
OpenGL本身就是一个非常庞大的状态机(State Machine) ,其状态通常被称为OpenGL上下文(Context)。它里面保存了一系列的变量用来描述OpenGL此刻需要如何运行,比如拍照时候要开启滤镜功能等等。
OpenGL使用C语言编写的,进而他的Api的封装也都是面向过程的,其函数本质上都是对OpenGL上下文状态机中的某个状态或者对象进行操作。
应用程序中可以创建多个不同的上下文,他们分别在各自的线程中使用。上下文之间共享纹理,缓冲区等资源,采用这中方案更为高效,因为它避免了反复切换上下文,或者大量修改渲染状态所造成的较大的开销。

D. android怎么实现listview置顶和取消置顶上下文菜

1、首先你要实现ListView。
2、其次是要自己继承Arrayadapter。
3、最后,因为要用枝滚到数据的排序,所以使用Arrayadapter绑定你的数据即可。Android是一个开源的,基于Linux的移动设备操作系统,主要使用于移动设备穗搭旁,如智能手机和平板电脑猜橡。

E. 对于android里面的content不理解,查找说这个是上下文,但是我还是没有这个概念,什么是上下文求大神讲解

Context 吧
Context字面意思上下文,位于framework package的android.content.Context中,
其实该类为LONG型,类似Win32中的Handle句柄,
很多方法需要通过 Context才能识别调用者的实例,
比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,
代表调用者的 实例为Activity,而到了戚贺一个button的onClick(View view)等方法时,
我们用this时就会报错,所以我们可能使用ActivityName.this来解决,
主要原因是因为实现Context的类主要有Android特有的几个模型,
Activity、Service以及BroadcastReceiver。
Context提供了关于应皮亩用环境全局信息的接口。它是一个抽象类,它的执行被Android系统所提供。它允许获取以应用为特征的资源和类型。同时启动应用级的操作,如启动Activity,broadcasting和接收intents。

两种类型的Context
在android中context可以作很多操作,但是最主要的功能是加载和访问资源。
在android中有两种context,一种是 application context,一种是activity context,通常我们在各种类和方法间传递的是activity context。

application context
我们可以使用application context。application context伴随application的一生,与activity的生命周期无关。
application context可以通过Context.getApplicationContext或者Activity.getApplication方法获取。这个context 实燃仔森际就是在AndroidManifest.xml application 节点定义的类

F. Android下使用chcon修改文件的安全上下文(file_contexts)

spm8666p1_64:/system/bin # ls -Z otaclient*
u:object_r:otaclient_exec:s0 otaclient
u:object_r:otaclient_exec:s0 otaclient_bak
spm8666p1_64:/system/bin #

chcon u:object_r:otaclient_exec:s0 otaclient

G. Android选择条目时下方出现菜单选项

底部是菜单栏,点击就可以查看。
菜单是用户界面中最常誉运见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu),以下说的是创建OptionsMenu。
默认样式好虚含是在屏幕底部弹出一个菜单,这个菜单我们就叫他选项菜单OptionsMenu,一般情况下,选项菜单最多显示2排每排3个菜单项,这些菜单项有文字有图标,也被称作Icon Menus,如果多于6项,从第六项开始会被隐藏,在第六项会出现一个More里,点击More才出现第六项以及以后的菜单项,这些菜友笑单项也被称作Expanded Menus。

H. Android Activity 和 上下文Context 的关系

首先看继承关系:

可以看到Activity继承于ContextThemeWrapper,ContextThemeWrapper继承于ContextWrapper,ContextWrapper继承于Context。也就是说,Context是Activity的父类。


相关延伸:

说到Activity与Context关系,少不了Application与二者的关系,上图可以明确看到Context是Application的父类,那么对于参数传递,需要传递Context对象的时候,

我们是传activity.this还是this.getApplicationContext()呢?

activity的生命周期肯定没有application长,所以为了防止内存泄露:

  1. 只要application可以满足的就传this.getApplicationContext()。比如用来ShowToast、获取LayoutInflater对象、获取数据库对象、获取SharedPreferences对象、发广播context.sendBroadcast等,都可以传this.getApplicationContext()。

  2. application不能满足的必须传activity。比如showDialog、activity之间跳转等。

I. Android基础知识

一、activity

1.一个activity就是一个类,继承activity;

2.需要复写onCreate()方法;

3.每一个activity都需要在AndroidMainfest.xml清单上进行配置;

4.为activity添加必要的控件。

二、布局

线性布局:LinearLayout

1.填满父空间:fill_parent、match_parent

2.文本多大空间就有多大:warp_content

3.文字对齐方式:gravity

4.占屏幕的比例:layout_weight="1"  水平方向,则width=0,垂直方向,则height=0

5.一行显示,空间不够会省略:singleLine="ture"  false会换行

6.背景:background="#ffffff"

7.水平布局:orientation="horizontal"

垂直布局:orientation="vertivcal"

表格布局:TableLayout

1.内边距:padding

2.外边距:marginLeft\Start、Right\End、Top、Bottom

三、RelativeLayout相对布局

layout_above 将该控件的底部置于给定ID控件之上

layout_below 将该控件的顶部置于给定ID控件之下

layout_toLeftOf 将该控件的右边缘和给定ID控件的左边缘对齐

layout_toRightOf 将该控件的左边缘和给定ID控件的右边缘对齐

layout_alignBaseline 该控件的baseline和给定ID的控件的Baseline对齐

layout_alignBottom 该控件的底部边缘和给定ID的控件的底部边缘对齐

layout_alignLeft 该控件的左边缘和给定ID的控件的左边缘对齐

layout_alignRight 该控件的右边缘和给定ID的控件的右边缘对齐

layout_alignTop 该控件的顶部边缘和给定ID的控件的顶部边缘对齐

layout_alignparentBottom 如果该值为true,则该控件的底部和父控件的底部对齐layout_alignParentLeft 如果该值为true,则该控件的左边和父控件的左边对齐

layout_alignParentRight 如果该值为true,则该控件的右边和父控件的右边对齐

layout_alignParentTop 如果该值为true,则该控件的上边和父控件的上边对齐

layout_centerHorizontal 如果该值为true,则该控件将被置于水平方向的中央

layout_centerInParent 如果该值为true,则该控件将被置于父控件水平和垂直方向的中央

layout_centerVertival 如果该值为true,则该控件将被置于垂直方向的中央

四、一个Intent对象包含一组信息

1.Component name

2.Action

3.Data

4.Category

5.Extras

6.Flags

Intent intent = new Intent(this, SecondActivity.class);

startActivity(intent);  //startActivity方法

intent.putExtra("Key", "Value");  //键值对

intent = getIntent();

String value = intent.getStringExtra("Key");    //通过键提取数据

五、初级控件:EditText、TextView、Button

1.获取EditText的值

String value = EditText.getText().toString();

2.将值放到Intent对象中

Intent intent = new Intent();

intent.putExtra("one",value )

intent.setCalss(Activity.this, OtherActivity.class);

3.使用这个Intent对象来启动Otheractivity

Activity.this.startActivity(intent);

4.将监听器的对象绑定到按钮对象上

button.setOnclickListener(new Listener());

5.得到Intent对象当中的值

Intent intent = getIntent();

String value1 = intent.getStringExtra("one");

int value2 = Integer.parseInt(value);

六、其他初级控件使用

①ImageView

②RadioGroup和RadioButton

setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener())

③Checkbox

setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener())

④Menu

1.当客户点击MENU按钮的时候,调用onCreateOptionMenu()方法

public boolean onCreateOptionMenu(Menu menu){

menu.add(0,1,1,R.string.id);

}

2.当客户点击MENU内部的具体某一个选项时,调用onOptionItemSelected()方法

public boolean onOptionItemSelected(MenuItem item){

if(item.getItemId() == 1){

finish();

}

return super.onOptionItemSelected(item);

}

七、Activity的生命周期

1.第一次创建时调用

protected void onCreat(Bundle saveInstanceState);

2.显示出来时调用

protected void onStrat();

3.获得用户焦点时调用(可操作)

protected void onResume();

4.点击弹出第二个Activity时调用

protected void onPause();

5.当第一个Activity不可见时调用

protected void onStop();

6.当返回第一个Activity时调用,代替OnCreate,因为没被销毁

protected void onRestart();

7.当返回第一个Activity时调用(先执行onStop,在执行,因为第二个Activity被销毁,不能返回获取,只能通过onCreat,onStart,onResume再创建)

protected void onDestory();

八、Task

1.Task是存放Activity的Stack栈。当点击启动第二个Activiry时,第一个Activtiy会被压入Stack栈当中,第二个Activity会位于栈的顶部;当返回第一个Activtiy时,第二个Activity会被弹出Stack,第一个Activity会位于栈的顶部,以此类推。

注释:当调用finish()时,当前的Activity会被Destory掉,栈中的Activity会消失。

2.当Activity都从Stack退出后,则就不存在Task。

九、高级控件

①进度条ProgressBar

水平进度条style="?android:attr/progressBarStyleHorizontal"

圆圈进度条style="?android:attr/progressBarStyle"

用户可视的visibility="gone"

②列表ListView

十、其他控件

A.下拉菜单Spinner

1.创建一个ArrayAdapter:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(

this, //指上下文对象

R.array.plant_array, //引用了在文件中定义的String数组

android.R.layout.simple_spinner_item);//用来指定Spinner的样式,可替换自定义

adapter.setDropDownViewResource(

android.R.layout.simple_spinner_dropdown_item);//设置Spinner当中每个条目的样式

2.得到Spinner对象,并设置数据:

spinner=(spinner)findViewById(R.id.spinnerId);

spinner.setAdapter(adapter);

spinner.setPrompt("测试");//标题

3.创建监听器

class SpinnerOnSelectListener implements OnItemSelectedListener{

@override

public void onItemSelected(

AdapterView<?> adapterView,//整个列表对象

View view,//被选中的具体条目对象

int position,//位置

long id){ //id

String selected = adapterView.getItemAtPosition(position).toString();

}

@override

public void onNothingSelected(AdapterView<?> adapterView){

S.o.p("nothingSelected");

}

}

4.绑定监听器

spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());

注:第二种动态设计

1.创建ArrayList对象

List<String> list = new ArrayList<String>();

list.add("test1");

2. 调用方法

ArrayAdapter adapter = new ArrayAdapter(

this, //指上下文对象

R.layout.item, //引用了指定了下拉菜单的自定义布局文件

R.id.textViewId,//id

list);//数据

3.得到Spinner对象,并设置对象

spinner.setAdapter(adapter);

spinner.setPrompt("测试");//标题

3.创建监听器

class SpinnerOnSelectListener implements OnItemSelectedListener{

@override

public void onItemSelected(

AdapterView<?> adapterView,//整个列表对象

View view,//被选中的具体条目对象

int position,//位置

long id){ //id

String selected = adapterView.getItemAtPosition(position).toString();

}

@override

public void onNothingSelected(AdapterView<?> adapterView){

S.o.p("nothingSelected");

}

}

4.绑定监听器

spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());

B.DatePicker和DatePickerDialog

1.声明一个监听器,使用匿名内部类

DatePickerDialog.OnDateSetListener onDateSetListener

= new DatePivkerDialog.OnDateSetListener(){

public void onDateSet(

DatePicker view,

int year,

int monthOfYear,

int dayOfMonth){

S.o.p(year+"-"+motnOfYear+"-"+dayOfMonth)

}

}

2.复写onCreateDialog(int id)方法:

@override

protected Dialog onCreateDialog(int id){

switch(id){

case DATE_PICKER_ID:

return new DatePickerDialog(this,onDateSetListener,2019,11,25);

}

return null;

}

3.使用时调用showDialog()方法

showDialog(DATE_PICKER_ID);

C.AutoCompleteTextView

B.Widget

C.Animatin

十一、实现ContentProvider过程

1.定义一个CONTENT_URI常量

2.定义一个类,继承ContentProvider

3.实现query、insert、update、delete、getType和onCreate方法

4.在AndroidManifest.xml当中进行声明

J. android 上下文对象对象是什么意思

你说的是Context吧,它代表的是某个类的团辩引用,比如
public class B{
private Context mContext;
public B(Context context){
mContext = context;
.......................
}
}
如果在class A中新建了塌腊缺一个class B的对局竖象,B b = new B(A.this);那么B的构造方法中的context参数就是A的引用,在android中如果A是Activity那么B中的mContext经过赋值后就可以像使用Activity一样使用mContext,比如mContext.startActivity(..........);
((Activity)mContext).finish();等等

热点内容
转移的存储卡 发布:2025-05-12 04:51:18 浏览:465
c语言大数相加 发布:2025-05-12 04:51:13 浏览:587
安卓内存大小有什么影响 发布:2025-05-12 04:41:36 浏览:49
以下c语言常量错误的是 发布:2025-05-12 04:40:39 浏览:806
怎么降低qq版本安卓80 发布:2025-05-12 04:40:39 浏览:189
一个密码多少人知道后就不是秘密 发布:2025-05-12 04:26:07 浏览:520
ftp端口非21 发布:2025-05-12 04:09:09 浏览:228
云服务器屏蔽ip 发布:2025-05-12 04:08:47 浏览:911
为什么安卓接口充电线松 发布:2025-05-12 03:41:20 浏览:669
安卓手机打击垫怎么玩 发布:2025-05-12 03:23:14 浏览:241