首页 > 其他分享 >Android笔记

Android笔记

时间:2024-04-03 13:32:58浏览次数:17  
标签:数据 笔记 广播 intent Activity Intent Android 方法

android 四大组件
Activity (活动):

  • 主要用途:作为用户操作的可视化界面,允许用户在不同的屏幕或窗口间导航。
  • 与用户互动:Activity提供了一个完成操作指令的窗口,允许用户与之进行交互。
  • 生命周期:Activity可以通过Intent启动,并在其生命周期中经历多种状态,如运行态、暂停态、停止态
  • 和销毁态。
  • 注册方式:必须在AndroidManifest.xml配置文件中声明Activity,以便系统能够识别和管理。
  • 应用中每一个 Activity 都必须要在 AndroidManifest.xml 配置文件中声明,否则系统将不识别也不执行该Activity。在 android stdio会自动生成,
  • 定义与作用: Activity 的中文意思是活动,代表手机屏幕的一屏,或是平板电脑中的一个窗口,提供了和用户交互的可视化界面。一个活动开始,代表 Activity 组件启动,活动结束,代表一个 Activity 的生命周期结束。一个 Android 应用必须通过 Activity 来运行和启动,Activity 的生命周期交给系统统一管理。Activity 是用于处理 UI 相关业务的,比如加载界面、监听用户操作事件。
  • 生命周期的方法
    1. onCreate()方法
    1. onStart()方法
    1. onResume()方法
    1. onPause()方法
    1. onStop()方法
    1. onDestroy()方法
  • 7.onRestart()方法
  • Activity的启动模式
  • (1). Android任务栈
  • (2). Activity的四种启动模式
    1. standard 模式
    1. singleTop 模式
    1. singleTask 模式
    1. singleInstance 模式
  • Fragment(碎片)
  • (1). Fragment的生命周期
  • (2). 创建Fragment
  • (3). 在Activtiy中添加Fragment
    1. 直接在布局文件中添加Fragment
    1. 当Activity运行时添加Fragment

Service (服务):

  • 主要用途:作为一个后台运行的组件,用于执行长时间运行且不需要与用户实时交互的任务。
  • 与用户互动:通常不直接与用户交互,除非通过广播接收器。
  • 生命周期:Service有自己的生命周期,需要通过AndroidManifest.xml进行配置。
  • 启动方式:可以使用startService()bindService()stopService()等方法启动或销毁Service
  • Service(服务)是安卓中的四大组件之一,它通常用于在后台处理耗时的逻辑,与 Activity 一样,它存在自己的生命周期,也需要在 AndroidManifest.xml 配置相关信息。开发人员需要在应用程序配置文件中声明全部的 service,使用 < service>< /service> 标签。 Service 通常位于后台运行,它一般不需要与用户交互,因此 Service 组件没有图形用户界面。Service 组件需要继承Service 基类。Service 组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。
  • 一个组件能够绑定到一个service与之交互(IPC机制) ,IPC机制:进程间的通信,传统的进程通信的方式有 Socket,管道,内存共享,消息队列等 安卓采用进程通信机制 Binder,使用 Binder 可以做到只对数据进行一次拷贝,并在每次通信的时候问每个用户进程添加标识。因此相对传统的 IPC 机制性能和安全性都相对较高。
    Content Provider (内容提供者):
    Content Provider是 android 四大组件之一的内容提供器,它主要的作用就是将程序的内部的数据和外部进行共享,为数据提供外部访问接口,被访问的数据主要以数据库的形式存在,而且还可以选择共享哪一部分的数据。这样一来,对于程序当中的隐私数据可以不共享,从而更加安全。Content Provider 是 android中 一种跨程序共享数据的重要组件
  • 主要用途:用于在不同应用程序之间共享数据,类似于数据库的功能。
  • 数据共享:支持指定共享数据的类型,使得其他应用程序可以访问这些数据。
  • android 平台提供了 ContentProvider 把一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类 从该内容提供者中获取或存入数据。
  • 只有需要在多个应用程序间共享数据是才需要 内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
  • ContentProvider 实现数据共享。ContentProvider 用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为 android 没有提供所有应用共同访问的公共存储区。
  • 开发人员不会直接使用 ContentProvider 类的对象,大多数是通过 ContentResolver 对象实现对 Content Provider 的操作。
  • Content Provider 使用 URI 来唯一标识其数据集,这里的 URI 以 content:// 作为前缀,表示该数据由 Content Provider来管理。
  • 四大基本组件都需要注册才能使用,每个 Activity、service、Content Provider 都需要在 AndroidManifest 文件中进行配置。AndroidManifest 文件中未进行声明的 activity、服务 以及 内容提供者 将不为系统所见,从而也就不可用。而 broadcast receiver 广播接收者的注册分静态注册(在AndroidManifest文件中进行配置)和通过代码动态创建并以调用Context.registerReceiver()的方式注册至系统。需要注意的是在AndroidManifest文件中进行配置的广播接收者会随系统的启动而一直处于活跃状态,只要接收到感兴趣的广播就会触发(即使程序未运行)。

Broadcast Receiver (广播接收器):

  • 主要用途:用于接收来自操作系统或其他应用的广播消息。

  • 接收广播:可以通过静态注册或动态注册的方式接收广播。

  • 响应广播:广播接收器可以根据收到的广播消息采取相应的行动。

  • 广播的作用

  • 用于不同组件间的通信(含:应用内/不同应用之间)

  • 用于多线程通信

  • 与 android 系统的通信
    广播接收者的创建

  • 构建 Intent,使用 sendBroadcast 方法发出广播。

  • 自定义一个类,该 类 继承 BroadcastReceive 基类

  • 重写抽象方法 onReceive() 方法

  • 注册该广播接收者,我们可以在代码中注册,也可以在 manifest.xml 中注册。
    广播接收者的类型

  • Normal broadcasts:默认广播。发送一个默认广播使用 Content.sendBroadcast() 方法,普通广播对于接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。

  • Ordered broadcasts:有序广播。发送一个有序广播使用 Content.sendOrderedBroadcast() 方法,有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接收者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播

  • Sticky Broadcast:粘性广播。当处理完之后的 Intent,依然存在,直到你把它去掉。
    注册广播的两种方式

广播接收者的注册有两种方法,分别是AndroidManifest文件中进行静态注册和程序动态注册。

  1. 第一种是静态注册,也可成为常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这中方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于想开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。
  2. 第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否会会内存泄露

优先级

  1. 优先级高的先接收
  2. 同优先级的广播接收器,动态优先于静态
  3. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。

有序广播的拦截和篡改

拦截:在广播接收者中,使用abortBroadcast()方法,可以终止有序广播向后继续传递,即后续的接收者们将无法接收到该广播。注意:该方法只能在接收有序广播时调用!
篡改:在广播接收者中,调用setResult()方法,可以向广播中添加数据,并在后续的接收者中,可以通过getResult()获取这些数据,同时,后续的接收者也可以再次调用setResult()方法重新向广播中写入数据,即覆盖原有的数据,以实现篡改。

Android四大核心组件指的是 Activity、Service、Content Provider、BroadCast Receiver,核心组件都是由
系统进行管理和维护的,一般都要在清单文件中进行注册或者在代码中动态注册。

Android中的Intent是一种用于组件间通信的机制,它允许应用程序在不同的组件(如Activity、Service、
Broadcast Receiver)之间传递信息。

启动Activity。使用startActivity()方法或startActivityForResult()方法可以启动一个新的Activity,并通过Intent对
象传递必要的参数和其他数据。例如,创建一个Intent对象,指定要启动的Activity的类,然后调用startActivity()
方法即可

启动Service。使用startService()方法或bindService()方法,可以启动一个Service,同样通过Intent对象传递参
数。startService()方法用于启动一个后台服务,而bindService()方法则允许应用程序与Service进行更紧密的交
互。
发送广播。使用sendBroadcast()方法、sendOrderedBroadcast()方法或sendStickyBroadcast()方法,可以发送
自定义广播。广播是一种所有应用都可以接收的信息,用于在应用程序之间传递消息

传递数据(对象)。使用putExtra()方法,可以在Intent中传递额外的数据,这些数据可以是基本类型或
Serializable、Parcelable对象。在目标Activity或Service中,可以通过getIntent().getExtras()方法获取这些数
据。
调用系统功能。可以使用Intent来调用系统内置的功能,如拨打电话、发送短信、打开网页或发送电子邮件等。
这通常涉及到解析特定的Uri来指定操作,如tel:、smsto:、content://等。

Intent分为显式Intent和隐式Intent。

Intent有多个构造函数的重载,常用的一个有Intent(Context packageContext, Class<?> cls)。这个构造函数需要接受两个参数,第一个参数Context要求提供一个启动活动的上下文,一般就是自身的活动类名,而第二个参数Class则是需要指定想要启动的目标活动类名。

@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}

二、隐式Intent的使用
相比显示Intent,隐式Intent稍微复杂一点。隐式Intent需要指定action、category等信息,交由系统分析这个Intent,然后才能找到相应的活动去启动。

首先,需要配置AndroidManifest.xml文件中标签下标签的内容,可以指定当前活动能够响应的action和category。

这里的标签指明了当前活动可以响应的action为MyApplication.intent.action.START,而标签则包含了一些附加信息,可以更精确地指明当前活动能响应的Intent中还可能带有的category。

然后,修改需要通过Intent来启动该活动的FirstActivity中按钮的点击事件:

button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(“MyApplication.intent.action.START”);
//Intent intent = new Intent(“MyApplication.intent.action.START”);//设置Action另一种更加便捷的写法
//intent.addCategory(“android.intent.category.DEFAULT”);//这句省略也行,省略时在startActivity时会自动添加
intent.addCategory(“android.intent.Mycategory”);
startActivity(intent);
}
});

每个Intent只能指定一个action,但是可以指定多个category,只有当和中的内容和Intent中指定的action和category的内容一致时,这个活动才能响应Intent。

要注意的是,Activity中的intent.addCategory(“android.intent.category.DEFAULT”)可以省略不写,因为在startActivity方法运行的时候系统会自动添加这句,但是在AndroidManifest中的中

是不可以省略的,因为在运行startActivity方法时,如果没有显示写intent.addCategory(“android.intent.category.DEFAULT”)这句,系统一定会自动添加,所以如果中省略了

那么系统会找不到对应相匹配的活动来启动,从而报错:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=MyApplication.intent.action.START cat=[android.intent.Mycategory] }

(也就是说在设置中的标签时,必须配套出现)

、隐式Intent其他用法

隐式Intent还可以用来调用系统浏览器来展示页面、调用拨号程序、打开地图定位等。
在Activity中添加按钮控件,修改Activity中按钮的点击事件:
@Override
public void onClick(View v) {
//Uri传值第一种方法
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(“https://www.baidu.com”));
startActivity(intent);
}

@Override
public void onClick(View v) {
//Uri传值第二种方法
Uri uri = Uri.parse(“tel:10086”);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}

@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(“geo:39.868433,116.013426”));
startActivity(intent);
}

首先我们指定了Intent的Action为Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW。然后通过Uri.parse()方法,将一段字符串解析成一个Uri对象,并将其通过setData方法传递给Intent(代码中的方法一,方法二则是通过Intent的构造方法直接将Uri对象传递进去)

、向下一个活动传递数据
Intent还可以在启动活动的时候传递数据:我们可以通过Intent中提供的putExtra()方法,将我们想要传递的数据暂时存储在Intent中,并在另一个活动启动后,再从Intent中取出来。

示例:

在FirstActivity中需要将一个字符串传递给SecondActivity。

@Override
public void onClick(View v) {
String data = “I am FirstAvtivity”;
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra(“key”,data);
startActivity(intent);
}

这里的putExtra()方法接收了两个参数,第一个为键名,第二个才是想要传递的数据。SecondActivity需要通过键名取出FirstActivity从Intent传递过来的数据。

  Intent intent = getIntent();
   String data = intent.getStringExtra("key"); 

在SecondActivity中,首先通过getIntent()方法获取到用于启动SecondActivity的Intent,然后使用intent.getStringExtra()方法来获取键名为key的数据(由于传递的数据为String类型,所以使用的是getStringExtra()方法,若数据为整形类型和布尔类型,则相应地使用getIntExtra()方法和getBooleanExtra()方法)。

返回数据给上一个活动
数据可以从上一个活动流向下一个活动,那么如果需要下一个活动给予上一个活动一个反馈的数据呢?这时候就需要用到startActivityForResult()方法了。查看文档可以知道startActivityForResult()方法也是用于启动活动的,但这个方法能够在活动销毁时返回一个结果给上一个活动。

startActivityForResult()接收两个参数,第一个参数是Intent,第二个参数是请求码,请求码用于判断数据来源,因此必须具有唯一性。

示例:现在需要实现退出SecondActivity后SecondActivity给FirstActivity回传一个数据。

首先修改FirstActivity中button1点击事件,不使用startActivity而是使用startActivityForResult()方法来启动SecondActivity,同时传入一个唯一的请求码1
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent,1);
}

然后修改SecondActivity中button2的点击事件,添加传递数据的逻辑。

@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra(“data_result”, “I am SecondAcitivity”);
setResult(RESULT_OK, intent);
finish();
}

从代码中可以看出,SecondActivity新建了一个Intent用于传递数据,同时也使用了一个setResult的方法,该方法接收了Intent对象,可以推测数据的传递就是通过该方法来进行的。

setResult()方法接收两个参数,第一个参数一般用于反馈当前活动对数据的处理结果,一般使用RESULT_OK或者RESULT_CANCELED这两个值,第二个参数则为需要传递的数据。

由于我们使用了startActivityForResult()方法来启动SecondActivity,与此对应的,在SecondActivity被销毁后会回调上一个活动的onActivityResult()方法,因此我们还需要在FirstActivity中重写该方法来获取数据。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra(“data_result”);
Log.i(“FirstActivity”, returnedData);
}
break;
default:
}
}

onActivityResult()方法接收三个参数,第一个requestCode就是我们在通过startActivityForResult()方法启动活动的时候传入的唯一的请求码,在该方法中会根据这个请求码进行相应的逻辑处理;第二个参数resultCode就是我们在返回数据时调用的setResult()方法传入的处理结果;第三个参数则为用于传递数据的Intent对象。

需要注意的是,这是通过点击Activity中的按钮进行对SecondActivity进行销毁的方法,若用户没有点击该按钮,而是点击手机中的返回键,那么这时数据就传递不回上一个活动了。

但是,我们可以通过在SecondActivity中重写onBackPressed()方法来解决这个问题:

@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra(“data_result”, “I am SecondAcitivity”);
setResult(RESULT_OK, intent);
finish();
}

Activity的四种启动模式

1.standard 模式
每启动一个Activity就会在栈顶创建一个新的实例

2.singleTop 模式
判断要启动的Activity实例是否位于栈顶,如果位于栈顶则直接复用,否则创建新的实例。

  1. singleTask 模式
    每次启动该Activity时,系统首先会检查栈中是否存在当前Activity实例,如果存在则直接使用,并把当前Activity之上的所有实例全部出栈,否则会重新创建一个实例

  2. singleInstance 模式
    指定为singleInstance 模式的Activity会启动一个新的任务栈来管理Activity实例,无论从哪个任务栈中启动该Activity,该实例在整个系统中只有一个。

意义:为了在不同程序中共享同一个Activity实例

Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View。因为layout五花八门,很多数据都不能直接绑定上去,所以Android引入了Adapter这个机制作为复杂数据展示的转换载体,所以各种Adapter只不过是转换的方式和能力不一样而已。

Adapter是将数据绑定到UI界面上的桥接类。Adapter负责创建显示每个项目的子View和提供对下层数据的访问。

在多数情况下,你不需要创建自己的Adapter。Android提供了一系列Adapter来将数据绑定到UI Widget上。

因为Android负责提供数据和选择用于显示每个项目的View,所以Adapter能快速地修改要绑定的控件的外观和功能。

Adapter是用来帮助填充数据的中间桥梁,比如通过它将数据填充到ListView, GridView, Gallery。

而android 提供了以下几种:Adapter:ArrayAdapter,BaseAdapter,CursorAdapter, HeaderViewListAdapter,ListAdapter,ResourceCursorAdapter,SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter

首先来看一下Adapter的体系结构:

一个Adapter的对象扮演一个桥梁的角色。这个桥梁连接着一个AdapterView和它所包含的数据。Adapter提供了一个通到数据项的途径。Adapter还负责为在数据集里的每个数据生项生成一个View。它有一个重要的方法:

public abstract View getView (int position,View convertView,ViewGroup parent)
1.
这个方法被setListAdapter(adapter)间接地调用。getView 方法的作用是得到一个View,这个view显示数据项里指定位置的数据,你可以手动创建一个view或者从一个XML layout中inflate。

当这个view被inflated,它的父view(如GridView,ListView等)将要使用默认的layout参数,除非你用inflate(int,android.view.ViewGroup,boolean)方法来指定一个根view并防止附着在根上。

下面分别讲一下它的几个常见的子类:

ListAdapter接口:继承于Adapter。ListAdapter是一个ListView和list上的数据之间的桥梁。数据经常来自于一个Cursor,但这不是必须的。

ListView能显示任何数据,只要它是被一个ListAdapter包装的。

BaseAdapter抽象类:是一个实现了既能在ListView(实现了ListAdapter接口)和Spinner(实现了Spinner接口)里用的Adapter类的一般基类。

ArrayAdapter类:一个管理这样的ListView的ListAdapter:这个ListView被一个数组所支持。这个数组可装任意对象。默认状态下,这个类预期能这样:提供的资源id与一个单独的TextView相关联。如果你想用一个更复杂的layout,就要用包含了域id的构造函数。

这个域id能够与一个在更大的layout资源里的TextView相关联。它将被在数组里的每个对象的toString()方法所填满。你可以添加通常对象的lists或arrays。重写你对象的toString()方法来决定list里哪一个写有数据的text将被显示。

如果想用一些其它的不同于TextView的view来显示数组(比如ImageViews),或想有一些除了toString()返回值所填在views里的以外的数据,你就要重写getView(int,View,ViewGroup)方法来返回你想要的View类型。

SimpleCursorAdapter类:SimpleCursorAdapter绑定View到Content Provider查询返回的游标上。指定一个XML layout定义,然后将数据集中的每一列的值绑定到layout中的一个View上。
SimpleAdapter类:一个使静态数据和在XML中定义的Views对应起来的简单adapter。你可以把list上的数据指定为一个Map范型的ArrayList。ArrayList里的每一个条目对应于list里的一行。Maps包含着每一行的数据。

你先要指定一个XML,这个XML定义了用于显示一行的view。你还要指定一个对应关系,这个对应关系是从Map的keys对应到指定的views。

绑定数据到views发生在两个阶段:如果一个simpleAdapter.ViewBinder是可用的,那么SetViewValue(android.view.View,Object,String)要被调用。如果返回true,那么绑定发生了。如果返回false,那么如下views将被按顺序地尝试:

实现了Checkable的View(如CheckBox),预期的绑定值是boolen。
TextView,预期的绑定值是String,并且SetViewText方法被调用。
ImageView,预期的绑定值是一个资源的id或String。并且SetViewImage方法被调用。
如果没有合适的绑定被发现,一个IllegalStateException被抛出。
在这里插入图片描述
不论是那种适配器模式,也不管是Listview也好还是gridview也好,对他们填充数据,都是分三步走。

第一:创建一个数据填充的对象,可以是ListView, GridView, Gallery。

listView=(ListView) findViewById(R.id.listview_simple);
1.
第二步:创建一个数据填充器,可以是BaseAdapter、SimpleAdapter,也可以是与数据库相关联的CursorAdapter。

例如:SimpleAdapter可以使用系统封装好的,你也可以自己去继承一个Simpleadapter,来重写其中的方法。继承 simpleadapter的好处在于,你可以对listitem中每个单一的控件设置监听事件等等一系列操作。如果用的是系统封装好的就有点爱莫能助了。
直接使用系统封装的:
SimpleAdapter simpleAdapter = new SimpleAdapter(this,data, R.layout.simple_item, new String[] { “name”, “info” }, new int[] { R.id.simple_name, R.id.simple_info });

重写系统的simpleadpter:

第三步:将数据填充到对象中去

listView.setAdapter(simpleAdapter);

这样就完成了数据填充器的数据填充。

如果你的ListView的每一行想实现被点击后有响应事件。最省事的方法是继承一个ListActivity。

ListActivity是一个这样的Activity:这个Activity能通过绑定到一个像array或cursor这样的数据源来显示一些items的list,并且当用户选了一个item时,能够暴露事件句柄。

ListActivity拥有一个ListView对象。这个ListView对象能够被绑定到不同的数据源,特别是一个数组或者一个拥有查询结果的Cursor。ListActivity有三种用法,分别是Binding,Screen Layout和Row Layout。下面仅讨论一下Screen Layout:

ListActivity有一个默认的layout。这个 layout是由一个在屏幕中央的、单独的、全屏的list构成。然而,如果你想的话,你可以通过在onCreate()里调用setContentView()方法来设置你自己的view layout的方式制定屏幕layout。

要这样做,你自己的view必须包含一个id为“@android:id/android:list”(或者在代码中有list对象)。

当你制定这个view是空的时,你能够包含任何类型的view对象来显示。这个“空list”通知者必须有一个id“android:empty”。

注意,最后一定要调用setListAdapter(adapter)方法来把通过Adapter绑定了数据的这个List显示出来。

而且当点击listView里的item时,会根据getView重画这个ListView。想要实现事件监听,就要重写 protected void onListItemClick(ListView l, View v, int position,long id)方法。

想要把在XML中自定义了一行的view逐行显示在ListActivity中自定义的ListView中,并且在每行动态绑定数据的话,一般要自己写一个MyAdapter类,这个Adapter继承BaseAdapter并且其构造函数中至少有一个List参数来实现动态绑定数据。有两个重要的步骤:

重写getView方法,其中一重要步骤就是用items.get(position)方法来获得被传入的数据。其中items是一个List,它被赋了传入的List参数的值。position是这个数据在ListView中的行数。Get返回的是E类型.即List中的模板类型。

写一个内部类private class ViewHolder。这个内部类只有成员变量,它们就是你想在ListView中的一行里要显示的小View成分。

Adapter在Android中占据一个重要的角色,它是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。下图直观的表达了Data、Adapter、View三者的关系。
在这里插入图片描述

标签:数据,笔记,广播,intent,Activity,Intent,Android,方法
From: https://blog.csdn.net/github_34203934/article/details/137341607

相关文章

  • 剑指Offer题目笔记24(集合的组合、排序)
    面试题79:问题:​输入一个不含重复数字的数据集合,找出它的所有子集。解决方案:​使用回溯法。子集就是从一个集合中选出若干元素。如果集合中包含n个元素,那么生成子集可以分为n步,每一步从集合中取出一个数字,此时面临两个选择,将该数字添加到子集中或不将该数字添加到子集......
  • 剑指Offer题目笔记25(使用回溯法解决其他类型问题)
    面试题85:问题:​输入一个正整数n,输出所有包含n个左括号和n个右括号的组合,要求每个组合的左括号和右括号匹配。解决方案:​使用回溯法。因为要生成n个左括号和n个右括号,故需要走2n步,每一步生成一个括号,每一步都面临两个选项,既可能生成左括号也可能生成右括号。有限制条......
  • SV学习笔记(一)
    SV:SystemVerilog开启SV之路数据类型內建数据类型四状态与双状态:四状态指0、1、X、Z,包括logic、integer、reg、wire。双状态指0、1,包括bit、byte、shortint、int、longint。有符号与无符号:有符号:byte、shortint、int、longint、integer。无符号:bit、logic、......
  • SV学习笔记(二)
    接口什么是接口?接口主要用作验证,国外有些团队会使用sv进行设计,那么接口就会用作设计。验证环境中,接口可以使连接变得简洁而不易出错。interface和module的使用性质很像,可以定义端口,也可以定义双向信号,可以使用initial和always,也可以定义function和task。interface可......
  • 一个优秀的Android程序员应该侧重于技术还是业务需求?
    前言一个优秀的程序员应该侧重于技术还是业务需求?这是要一个值得探讨的问题…刚入社会时,相信很多朋友都会思考这个问题。有人觉得:“技术当然重要,没有技术根本做不了事。技术高,还可以炫耀,出去找工作轻轻松松,是不是很cool?”也有人觉得:“对程序员来说,业务就是做某一个......
  • 书生·浦语大模型趣味Demo课程笔记
    第二节书生·浦语大模型趣味Demo实践环境准备浦语大模型的开发机器支持了cuda11.7的基础环境和一些自动迁移conda配置脚本迁移conda环境命令:studio-conda-ointernlm-base-tdemo如果自己安装软件环境:condacreate-ndemopython==3.10-ycondaactivatedemoconda......
  • Android14应用启动流程(源码+Trace)
    1.简介应用启动过程快的都不需要一秒钟,但这整个过程的执行是比较复杂的,无论是对手机厂商、应用开发来说启动速度也是核心用户体验指标之一,本文采用Android14源码与perfetto工具进行解析。源码参考地址:Searchtrace分析工具:PerfettoUI2.Input事件处理流程Input是Android......
  • JavaSE-进阶-学习笔记-JUC
    一.悲观锁和乐观锁悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。synchronized关键字和Lock的实现类都是悲观锁使用场景:适合写操作多的场景,先加锁可以保证写操作时数据正确。显式的锁定之后再操作......
  • 【阅读笔记】MySQL数据库存储类型选择
    摘自:《高性能MySQL》第四版原则更小的通常更好一般来说,尽量使用能够正确存储和表示数据的最小数据类型。更小的数据类型通常更快,因为它们占用的磁盘、内存和CPU缓存的空间更少,并且处理时需要的CPU周期也更少。简单为好简单数据类型的操作通常需要更少的CPU周期。例如,整型数......
  • Android12.0 系统关于安兔兔显示信息的修改
    1.前言在12.0的系统rom定制化开发中,在一些产品开发中,对于安兔兔等第三方检测工具,检测不出某些版本的内核信息等,显示0GB等问题的相关修改,由于不知道安兔兔的检测方式,所以就需要来修改关于文本上的一些信息了2.系统关于安兔兔显示信息的修改的核心类frameworks/base/core/jav......