android上下文
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长,所以为了防止内存泄露:
只要application可以满足的就传this.getApplicationContext()。比如用来ShowToast、获取LayoutInflater对象、获取数据库对象、获取SharedPreferences对象、发广播context.sendBroadcast等,都可以传this.getApplicationContext()。
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();等等