java

借图事件监听机制中由事件源,事件,事件监听器三类对象组成处理流程如下:Step1:为某个事件源(组件)设置一个监听器,用于监听用户操作Step2:用户的操作,触发了事件源的监听器Step3:生成了对应的事件对象Step4:将这个事件源对象作为参数传给事件监听器step5:事件监听器对事件对象进行判断,执行对应的事件处理器(对应事件的处理方法)五种不同的实现形式1、直接用匿名内部类直接setXxxListener后,重写里面的方法即可;通常是临时使用一次,复用性不高btnshow=(Button)findViewById(R.id.btnshow);btnshow.setOnClickListener(newView.OnClickListener(){//重写点击事件的处理方法onClick()@OverridepublicvoidonClick(Viewv){//显示提示Toast.makeText(getApplicationContext(),"你点击了按钮",Toast.LENGTH_SHORT).show();}});2、使用内部类btnshow.setOnClickListener(newBtnClickListener());}classBtnClickListenerimplementsView.OnClickListener{@OverridepublicvoidonClick(Viewv){Toast.makeText(getApplicationContext(),"你点击了按钮",Toast.LENGTH_SHORT).show();}}3、使用外部类和外部类但是,但是不能外部类直接访问组件,所以需要通过构造函数传入组件。4、直接使用Activity作为事件监听器//让Activity方法实现OnClickListener接口publicclassMainActivityextendsActivityimplementsOnClickListener{privateButtonbtnshow;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnshow=(Button)findViewById(R.id.btnshow);//直接写个thisbtnshow.setOnClickListener(this);}//重写接口中的抽象方法@OverridepublicvoidonClick(Viewv){Toast.makeText(getApplicationContext(),"点击了按钮",Toast.LENGTH_SHORT).show();}}直接让Activity继承OnClickListener,然后按钮直接监听this,并实现Activity的触发方法onClick。5、直接绑定到标签标签中加上这个,myclick是对应函数名android:onClick="myclick"@OverridepublicvoidmyClick(Viewv){Toast.makeText(getApplicationContext(),"点击了按钮",Toast.LENGTH_SHORT).show();}

java

先做前端布局1、adapter_view.xml(图片加文本布局)<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><ImageViewandroid:id="@+id/ima1"android:layout_width="50dp"android:layout_height="50dp"android:src="@mipmap/ic_launcher"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="52dp"android:orientation="vertical"><TextViewandroid:id="@+id/tv1"android:layout_width="wrap_content"android:layout_height="20dp"android:text="TextView"android:textColor="#FFEBCD"/><TextViewandroid:id="@+id/tv2"android:layout_width="wrap_content"android:layout_height="20dp"android:text="TextView"android:textColor="#000000"/></LinearLayout></LinearLayout>2、activity_main.xml(listview布局,相当于在这里把adapter_view.xml中的布局*N)<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ListViewandroid:id="@+id/lv1"android:layout_width="match_parent"android:layout_height="match_parent"/><!--这里设置一个ListView用来作为显示主界面,后面我们直观看到的就是它--></androidx.constraintlayout.widget.ConstraintLayout>3、在drawable文件中放上rc_1,rc_2,rc_3,rc_4,四张jpg图片,自己随便放,开心就好后端代码我们要把Animal的数据放到Listview中就需要用到adapter,所以这里通过继承BaseAdapter设计一个AnimalAdapter1、新建Animals.java类packagecom.example.test2;publicclassAnimals{privateStringanimal;privateStringanimalTell;privateintimgId;publicAnimals(Stringanimal,StringanimalTell,intimgId){this.animal=animal;this.animalTell=animalTell;this.imgId=imgId;}publicStringgetAnimalTell(){returnanimalTell;}publicvoidsetAnimalTell(StringanimalTell){this.animalTell=animalTell;}publicStringgetAnimal(){returnanimal;}publicvoidsetAnimal(Stringanimal){this.animal=animal;}publicintgetImgId(){returnimgId;}publicvoidsetImgId(intimgId){this.imgId=imgId;}}2.AnimalAdapter.java通过继承BaseAdapter设计packagecom.example.test2;importandroid.content.Context;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.ImageView;importandroid.widget.TextView;importjava.util.List;publicclassAnimalAdapterextendsBaseAdapter{privateContextcontext;//创建一个上下文对象privateList<Animals>datas;//创建一个List数组,里面存放Animal对象,用来接收MainActivity传过来的数据publicAnimalAdapter(Contextcontext,List<Animals>datas){this.context=context;this.datas=datas;}@OverridepublicintgetCount(){//获取数据的长度returndatas.size();}@OverridepublicObjectgetItem(inti){//适配器放入了很多条数据,获取数据所在的位置returndatas.get(i);}@OverridepubliclonggetItemId(inti){returni;}@OverridepublicViewgetView(inti,Viewview,ViewGroupviewGroup){Animalsanm=(Animals)getItem(i);//实例化给定位置上的对象Viewv;//创建视图v,这是是用来返回给ListView的,作为ListView的子视图ViewHoldviewHold;//创建临时的储存器ViewHold,它的作用是把你getView方法中每次返回的View存起来,可以下次再用if(view==null){v=LayoutInflater.from(context).inflate(R.layout.adapter_view,null);//将adapter_view视图作为子视图放入v中viewHold=newViewHold();//绑定id,建立与adapter_view视图的连接viewHold.animalImage=v.findViewById(R.id.ima1);viewHold.animalName=v.findViewById(R.id.tv1);viewHold.animalTell=v.findViewById(R.id.tv2);v.setTag(viewHold);//储器中的视图设置到v中}else{v=view;viewHold=(ViewHold)v.getTag();}//将制定位置上的数据显示到空间中viewHold.animalName.setText(anm.getAnimal());viewHold.animalTell.setText(anm.getAnimalTell());viewHold.animalImage.setImageResource(anm.getImgId());//返回视图v在main中显示returnv;}classViewHold{//将数据(也就是Animals对象)进行实例化,方便与xml文件里面的控件对接ImageViewanimalImage;TextViewanimalName;TextViewanimalTell;}}3、MainActivity.javapackagecom.example.test2;importandroidx.appcompat.app.AppCompatActivity;importandroid.os.Bundle;importandroid.view.View;importandroid.view.Window;importandroid.widget.AdapterView;importandroid.widget.ListView;importandroid.widget.Toast;importjava.util.ArrayList;importjava.util.List;publicclassMainActivityextendsAppCompatActivity{privateListViewmListView1;//创建ListView对象,将这个对象与xml文件中的ListView控件通过id的方式绑定绑定privateList<Animals>datas=newArrayList<Animals>();//创建一个List数组,用来存放数据privateAnimalAdapteranimalAdapter;//用来设置一个适配器的实现类对象@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initDatas();//初始化数据mListView1=(ListView)findViewById(R.id.lv1);//绑定控件animalAdapter=newAnimalAdapter(this,datas);//创建适配器的实现类对象,并且将本类的class对象和定义的数据作为参数传入mListView1.setAdapter(animalAdapter);//为ListView绑定一个适配器mListView1.setOnItemClickListener(newAdapterView.OnItemClickListener(){//为ListView创建一个监听事件,方便我们对它进行操作@OverridepublicvoidonItemClick(AdapterView<?>adapterView,Viewview,inti,longl){Toast.makeText(MainActivity.this,"您单击了"+datas.get(i).getAnimal(),Toast.LENGTH_SHORT).show();}});}privatevoidinitDatas(){//将Animals的实现类对象传到数据列表当中Animalsanimal1=newAnimals("喜羊羊","喜气洋洋过大年",R.drawable.rc_1);Animalsanimal2=newAnimals("懒羊羊","我就是喜欢吃",R.drawable.rc_2);Animalsanimal3=newAnimals("灰太狼","我一定会回来的",R.drawable.rc_3);Animalsanimal4=newAnimals("小灰灰","喜羊羊哥哥,带我一起玩",R.drawable.rc_4);for(inti=0;i<10;i++){datas.add(animal1);datas.add(animal2);datas.add(animal3);datas.add(animal4);}}}转载自https://blog.csdn.net/weixin_46067095/article/details/115741364

java

前面那些鸟玩意终于看完了,吐了,看完了啥也没记住。用到再说吧,先找有用的看。Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式显示到view上,提供给用户看!继承结构图一个读取联系人的代码:1、定义列表中每一行的布局,在res/layout目录下新建一个文件list_item.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/list_name"android:layout_width="0dp"android:layout_height="64dp"android:layout_weight="1"android:gravity="center"android:text="简单教程"android:textColor="#0000FF"android:textSize="18sp"/><TextViewandroid:id="@+id/list_phone"android:layout_width="0dp"android:layout_height="64dp"android:layout_weight="1"android:gravity="center"android:text="13888888888"android:textColor="#EA5C4D"android:textSize="18sp"/></LinearLayout>2、修改activity_main.xml添加一个ListView<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="8dp"android:orientation="vertical"><ListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="wrap_content"/></LinearLayout>3、修改MainActivity.javapublicclassMainActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListViewlist_test=(ListView)findViewById(R.id.list_test);//读取联系人Cursorcursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);SimpleCursorAdapterspcAdapter=newSimpleCursorAdapter(this,R.layout.list_item,cursor,newString[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER},newint[]{R.id.list_name,R.id.list_phone});ListViewlist_view=(ListView)findViewById(R.id.list_view);list_view.setAdapter(spcAdapter);}}读取联系人导致系统崩溃的原因:没有给权限最后AndroidManifest.xml里加个读联系人的权限<uses-permissionandroid:name="android.permission.READ_CONTACTS"/>我加了这一行,依然没用,就去手机设置的权限管理里面手动给开了权限了

2022-9-15 385 0
2022-9-15 388 0
java

前面看了TextView控件,后面不想看了,先把控件都记一下,知道功能,后面用到了再查资料吧1、EditText(输入框)用于输入文本2、Button(按钮)与ImageButton(图像按钮)用于点击事件3、ImageView(图像视图)用于玩图片的,可以设置图片填满,图纵横比,圆角图之类4、RadioButton(单选按钮)&Checkbox(复选框)单选框布局代码<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/LinearLayout1"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="请选择性别"android:textSize="23dp"/><RadioGroupandroid:id="@+id/radioGroup"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><RadioButtonandroid:id="@+id/btnMan"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="男"android:checked="true"/><RadioButtonandroid:id="@+id/btnWoman"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="女"/></RadioGroup><Buttonandroid:id="@+id/btnpost"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="提交"/></LinearLayout>点击事件判断:@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//RadioGroupradgroup=(RadioGroup)findViewById(R.id.radioGroup);////第一种获得单选按钮值的方法一开始是男,选了女之后会有提示,而不需要点击提交////为radioGroup设置一个监听器:setOnCheckedChanged()//radgroup.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){//@Override//publicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){//RadioButtonradbtn=(RadioButton)findViewById(checkedId);//Toast.makeText(getApplicationContext(),"按钮组值发生改变,你选了"+radbtn.getText(),Toast.LENGTH_LONG).show();//}//});////////第二种方式,通过点击提交按钮获取值Buttonbtnchange=(Button)findViewById(R.id.btnpost);RadioGroupradgroup=(RadioGroup)findViewById(R.id.radioGroup);//为radioGroup设置一个监听器:setOnCheckedChanged()btnchange.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){for(inti=0;i<radgroup.getChildCount();i++){//getChildCount()获得按钮组中的单选按钮的数目;RadioButtonrd=(RadioButton)radgroup.getChildAt(i);//getChinldAt(i):根据索引值获取我们的单选按钮if(rd.isChecked()){//isChecked():判断按钮是否选中Toast.makeText(getApplicationContext(),"点击提交按钮,获取你选择的是:"+rd.getText(),Toast.LENGTH_LONG).show();break;}}}});}复选框布局类似,大差不差,同时,可以根据需求修改选择框样式5、开关按钮ToggleButton和开关Switch6、ProgressBar(进度条)android:max:进度条的最大值android:progress:进度条已完成进度值android:progressDrawable:设置轨道对应的Drawable对象android:indeterminate:如果设置成true,则进度条不精确显示进度android:indeterminateDrawable:设置不显示进度的进度条的Drawable对象android:indeterminateDuration:设置不精确显示进度的持续时间android:secondaryProgress:二级进度条,类似于视频播放的一条是当前播放进度,一条是缓冲进度,前者通过progress属性进行设置!7、SeekBar(拖动条)这玩意是进度条的子类android:max="100"//滑动条的最大值android:progress="60"//滑动条的当前值android:secondaryProgress="70"//二级滑动条的进度android:thumb="@mipmap/sb_icon"//滑块的drawable接着要说下SeekBar的事件了,SeekBar.OnSeekBarChangeListener我们只需重写三个对应的方法:onProgressChanged:进度发生改变时会触发onStartTrackingTouch:按住SeekBar时会触发onStopTrackingTouch:放开SeekBar时触发8、RatingBar(星级评分条)最傻逼和最简单的。。。。。9、ScrollView(滚动条)滚动到底部:我们可以直接利用ScrollView给我们提供的:fullScroll()方法:scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部另外用这玩意的时候要小心异步的玩意,就是addView后,有可能还没有显示完,如果这个时候直接调用该方法的话,可能会无效,这就需要自己写handler来更新了~publicstaticvoidscrollToBottom(finalViewscroll,finalViewinner){HandlermHandler=newHandler();mHandler.post(newRunnable(){publicvoidrun(){if(scroll==null||inner==null){return;}intoffset=inner.getMeasuredHeight()-scroll.getHeight();if(offset<0){offset=0;}scroll.scrollTo(0,offset);}});}2.设置滚动的滑块图片这个更加简单:垂直方向滑块:android:scrollbarThumbVertical水平方向滑块:android:scrollbarThumbHorizontal

2022-9-15 854 0
java

TextView1、基础属性<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:gravity="center"android:background="#8fffad"><TextViewandroid:id="@+id/txtOne"android:layout_width="200dp"android:layout_height="200dp"android:gravity="center"android:text="TextView(显示框)"android:textColor="#EA5246"android:textStyle="bold|italic"android:background="#000000"android:textSize="18sp"/></RelativeLayout>2、实际开发2.1带阴影的textViewandroid:shadowColor:设置阴影颜色,需要与shadowRadius一起使用哦!android:shadowRadius:设置阴影的模糊程度,设为0.1就变成字体颜色了,建议使用3.0android:shadowDx:设置阴影在水平方向的偏移,就是水平方向阴影开始的横坐标位置android:shadowDy:设置阴影在竖直方向的偏移,就是竖直方向阴影开始的纵坐标位置2.2带边框的TextViewshapeDrawable,画2.3带图片(drawableXxx)的TextView:这里就把图片直接放在Drawable文件夹下就行然后在TextView中可以设置四个方向的图片:drawableTop(上),drawableButtom(下),drawableLeft(左),drawableRight(右)另外,也可以使用drawablePadding来设置图片与文字间的间距!<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.jay.example.test.MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:drawableTop="@drawable/show1"android:drawableLeft="@drawable/show1"android:drawableRight="@drawable/show1"android:drawableBottom="@drawable/show1"android:drawablePadding="10dp"android:text="张全蛋"/></RelativeLayout>这样设置的drawable并不能自行设置大小,在XML是无法直接设置的;所以我们需要在Java代码中来进行一个修改!publicclassMainActivityextendsAppCompatActivity{privateTextViewtxtZQD;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);txtZQD=(TextView)findViewById(R.id.txtZQD);Drawable[]drawable=txtZQD.getCompoundDrawables();//获得四个方向的图片资源放到数组//数组下表0~3,依次是:左上右下drawable[1].setBounds(100,0,200,200);txtZQD.setCompoundDrawables(drawable[0],drawable[1],drawable[2],drawable[3]);}}2.4使用autoLink属性识别链接类型<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="http://www.baidu.com"android:autoLink="web"android:textColor="#000000"android:textSize="30sp"android:background="@drawable/txt_rectborder"/>2.5TextView玩转HTML2.6SpannableString&SpannableStringBuilder定制文本这里的用到再看吧https://www.runoob.com/w3cnote/android-tutorial-textview.html后面还有啥跑马灯之类的,也是用到再说吧。

java

一、view和ViewGroupAPP的用户界面上的每一个组件都是使用View和ViewGroup对象的层次结构来构成的,如图1.要定义一个布局,可以用代码,也可以用xml文件定义。比如这样:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="IamaTextView"/><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="IamaButton"/></LinearLayout>实际应用中多数还是采用app控件以及标准的UI布局。二、六大布局:1、LinearLayout(线性布局)先图:大多用等比例划分的属性用于适配不同屏幕。2、RelativeLayout(相对布局)以父容器或者兄弟组件参考+margin+padding就可以设置组件的显示位置上图:以父容器定位以兄弟组件定位margin与padding的区别首先margin代表的是偏移,比如marginleft="5dp"表示组件离容器左边缘偏移5dp;而padding代表的则是填充,而填充的对象针对的是组件中的元素,比如TextView中的文字比如为TextView设置paddingleft="5dp",则是在组件里的元素的左边填充5dp的空间!margin针对的是容器中的组件,而padding针对的是组件中的元素,要区分开来!3、TableLayout(表格布局)4、FrameLayout(帧布局)属性:android:foreground:*设置改帧布局容器的前景图像android:foregroundGravity:设置前景图像显示的位置5、GridLayout(网格布局)6、AbsoluteLayout(绝对布局)建议少用,因为,可能不同手机屏幕大小像素的不同导致适配完全不同,换了就出错。单位dp①控制大小:android:layout_width:组件宽度android:layout_height:组件高度②控制位置:android:layout_x:设置组件的X坐标android:layout_y:设置组件的Y坐标androidstudio就可以玩,可以尝试一下。

2022-9-14 497 0
java

一、目录结构新建了一个空项目,目录结构就这样:java:我们写Java代码的地方,业务功能都在这里实现res:存放我们各种资源文件的地方,有图片,字符串,动画,音频等,还有各种形式的XML文件巨麻烦,一个前端一个后端,很烦。1、res资源目录PS:说到这个res目录,另外还有提下这个assets目录,虽然这里没有,但是我们可以自己创建,两者的区别在于是否前者下所有的资源文件都会在R.java文件下生成对应的资源id,而后者并不会;前者我们可以直接通过资源id访问到对应的资源;而后者则需要我们通过AssetManager以二进制流的形式来读取!对了,这个R文件可以理解为字典,res下每个资源都都会在这里生成一个唯一的iddrawable图片资源:drawable:存放各种位图文件,(.png,.jpg,.9png,.gif等)除此之外可能是一些其他的drawable类型的XML文件mipmap-hdpi:高分辨率,一般我们把图片丢这里mipmap-mdpi:中等分辨率,很少,除非兼容的的手机很旧mipmap-xhdpi:超高分辨率,手机屏幕材质越来越好,以后估计会慢慢往这里过渡mipmap-xxhdpi:超超高分辨率,这个在高端机上有所体现layout布局资源layout:该目录下存放的就是我们的布局文件,另外在一些特定的机型上,我们做屏幕适配,比如480*320这样的手机,我们会另外创建一套布局,就行:layout-480x320这样的文件夹!menu菜单资源menu:在以前有物理菜单按钮,即menu键的手机上,用的较多,现在用的并不多,菜单项相关的资源xml可在这里编写,不知道谷歌会不会出新的东西来替代菜单了~values目录demens.xml:定义尺寸资源string.xml:定义字符串资源styles.xml:定义样式资源colors.xml:定义颜色资源arrays.xml:定义数组资源attrs.xml:自定义控件时用的较多,自定义控件的属性!theme主题文件,和styles很相似,但是会对整个应用中的Actvitiy或指定Activity起作用,一般是改变窗口外观的!可在Java代码中通过setTheme使用,或者在Androidmanifest.xml中为<application...>添加theme的属性!PS:你可能看到过这样的values目录:values-w820dp,values-v11等,前者w代表平板设备,820dp代表屏幕宽度;而v11这样代表在API(11),即android3.0后才会用到的!AndroidManifest.xml主配置文件,用于配置各个组件的访问权限。Android程序签名打包签名的作用:1.应用程序升级:无缝升级到新的版本,包签名必须是同一证书。2.应用程序模块化3.代码数据共享:不同的应用程序之间,想共享数据,或者共享代码,那么要让他们运行在同一个进程中,而且要让他们用相同的证书签名。其余操作借鉴https://www.runoob.com/w3cnote/android-tutorial-sign-package.html反编译:工具apktools:https://ibotpeaches.github.io/Apktool/dex2jar:https://github.com/pxb1988/dex2jarJD-GUI:http://java-decompiler.github.io/感兴趣的自己研究吧。

2022-9-14 562 0
java

android代码名称:版本号版本名中文名API33Android13/AndroidT/Tiramisu/提拉米苏API32S_V2/sv2/SnowCone/刨冰API31Android12/AndroidS/SnowCone/刨冰API30Android11/AndroidR/RedVelvetCake(红丝绒蛋糕)/RVCAPI29Android10/AndroidQ(Android系统将直接被称为Android10,不再使用甜品做代号)APIQandroidQAPI28android9.0Pie馅饼API27android8.1Oreo奥利奥API26android8.0Oreo奥利奥API25android7.1Nougat牛轧糖API24android7.0Nougat牛轧糖API23android6.0Marshmallow棉花糖API22android5.1Lollipop棒棒糖API21android5.0Lollipop棒棒糖API20android4.4WKitKat奇巧巧克力棒API19android4.4KitKat奇巧巧克力棒API18android4.3JellyBean果冻豆API17android4.2JellyBean果冻豆API16android4.1JellyBean果冻豆API15android4.0.3~4.0.4IceCreamSandwich冰淇淋三明治API14android4.0~4.0.2IceCreamSandwich冰淇淋三明治API13android3.2Honeycomb蜂巢API12android3.1Honeycomb蜂巢API11android3.0Honeycomb蜂巢API10android2.3.3~2.3.7Gingerbread姜饼API9android2.3~2.3.2Gingerbread姜饼API8android2.2~2.2.3Froyo冻酸奶API7android2.1Éclair闪电泡芙API6android2.0.1Éclair闪电泡芙API5android2.0Éclair闪电泡芙API4android1.6Donut甜甜圈API3android1.5ICupcake纸杯蛋糕API2android1.1API1android1.0android架构:1、应用程序层就是程序员开发的那一层,就是平常用户用的那些app们。2、应用程序框架就是安卓操作系统所提供的各种API,程序员可以通过调用这些API进行程序开发。a.丰富而又可扩展的视图(Views),可以用来构建应用程序,它包括列表(lists),网格(grids),文本框(textboxes),按钮(buttons),甚至可嵌入的web浏览器。b.内容提供器(ContentProviders)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据。c.资源管理器(ResourceManager)提供非代码资源的访问,如本地字符串,图形,和布局文件(layoutfiles)。d.通知管理器(NotificationManager)使得应用程序可以在状态栏中显示自定义的提示信息。e.活动管理器(ActivityManager)用来管理应用程序生命周期并提供常用的导航回退功能。3、系统运行库a、程序库Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过Android应用程序框架为开发者提供服务。以下是一些核心库:主要包括基本的C库、以及多媒体库以支持各种多媒体格式、位图和矢量字体、2D和3D图形引擎、浏览器、数据库支持。1.Bionic系统C库。2.媒体库,基于PacketVideoOpenCORE。3.SurfaceManager顾名思义,用于管理Surface。4.Webkit,LibWebCore浏览器,基于Webkit引擎。5.SGL底层的2D图形引擎6.3Dlibraries基于OpenGLES1.0APIs实现7.FreeType位图(bitmap)和矢量(vector)字体显示。8.SQLite一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。b、Android运行库Android包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。(安卓5.0之后改用ART虚拟机)Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中的"dx"工具转化成.dex格式由虚拟机执行。Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。4、Linux内核Android的核心系统服务依赖于内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。每个安卓版本API对应的Linux内核版本也都不相同。Linux内核也同时作为硬件和软件栈之间的抽象层。其外还对其做了部分修改,主要涉及两部分修改:a)Binder(IPC):提供有效的进程间通信,虽然linux内核本身已经提供了这些功能,但Android系统很多服务都需要用到该功能,为了某种原因其实现了自己的一套。b)电源管理:为手持设备节省能耗。Android开发语言Java,分为3部分:a)java语言:即其语法,其写代码的程式b)java虚拟机:为了实现一次编译到处可以运行的原则,java在编译连接以后并没有产生目标机器语言,而是采用了Javabytecode这种Java共用指令,这时就需要一个虚拟机来执行改指令。c)库:跟我们常用的C语言一样提供一些常用的库后两者结合就是JavaRuntimeEnvironment。参考文献:https://blog.csdn.net/salary/article/details/82177546参考文献:https://www.cnblogs.com/skynet/archive/2010/04/15/1712924.html参考文献:https://www.cnblogs.com/lijunamneg/archive/2013/01/18/2866953.html

2022-9-14 593 0