【第一行代码笔记】(一)
Android 系统框架
1. Linux 内核层:为硬件提供底层的驱动,如显示驱动,音频驱动,照相机驱动,蓝牙驱动。
2.系统运行库层:通过C/C++库来为android系统提供主要的特性支持,如SQLite库提供数据库的支持,OpenGL|ES库提供了3D绘图的支持,WebKit库提供了浏览器内核的支持,同时,这一层还有Android运行时库,Android运行时库还包含了Dalvik虚拟机,它使得每一个Android应用都能运行在独立的进程当中,并且拥有自己的Dalvik虚拟机实例。
3.应用框架层:提供构建应用程序可能用到的各种API.
4.应用层:所有安装在手机上的应用
Android 四大组件
活动Activity,服务Service,广播接收器Broadcast Receiver,内容提供者 Content Provider
在活动中使用Menu
首先在res下的menu文件夹下,新建xml文件,每个item标签中定义一个菜单项
然后重写onCreateOptionMenu(Menu menu)方法,
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }
返回true表明允许创建的菜单显示出来,如果返回了false,创建的菜单则无法显示。
接下来定义菜单的响应事件。
public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case value: break; default: break; } return super.onOptionsItemSelected(item); }
根据不同的id对不同的菜单项做出相应的响应。
使用Intent在活动之间穿梭
Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件指甲传递数据。Intent的用法大致可以分成两种,显式Intent和隐式Intent
1.使用显式Intent
Intent(Context packageContext,Class<?> cls)
接受两个参数,第一个参数 Context 要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数就可以构造出Intent的意图
通过startActivity(Intent intent)启动目标活动
2.使用隐式Intent
不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent并找出合适的活动去启动。
什么叫合适的活动呢,简单来讲就是可以响应我们这个隐式Intent的活动,
通过在<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category。只有<action>和<actegory>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent
<category>标签包含了一些附加信息,更精确的指明当前活动。
Intent intent = new Intent("android.intent.action.MAIN");这是Intent的另外一个构造函数,直接将action的字符串传了进去。
每一个Intent中只能指定一个action,但却能指定多个category
调用Intent中的addCategory()方法来添加一个category
使用隐式Intent不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。
Intent intent = new Intent(Intent.ACTION_VIEW);intent.setData(Uri.parse("https://www.baidu.com"));startActivity(intent);
setData方法接收一个Uri对象,主要用于指定当前Intent正在操作的数据,而这些数据通常都是以字符串的形式传入到Uri.parse()方法中解析产生的。
与此对应,我们还可以在<intent-filter>标签中再配置一个<data>标签,用于更精确地指定当前活动能响应什么类型的数据。<data>标签中主要可以配置以下内容:
1.android:scheme:用于指定数据的协议部分
2.android:host:用于指定数据的主机名部分
3.android:port:用于指定数据的端口部分
4.android:path用于指定主机名和端口之后的部分
5.android:mimeType:用于指定可以处理的数据类型,允许使用通配符的方式进行指定
只有<data>标签中的指定内容和Intent中携带额Data完全一致时,当前活动才能够响应该Intent
button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("tel:10086")); startActivity(intent); } });
点击按钮之后,会启动拨号应用
向下一个活动传递数据
Intent中提供了一系列putExtra()方法的重载,可以把我们想要的传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出就可以了
String data = "Hello WebActivity"; Intent intent = new Intent(MainActivity.this, WebActivity.class); intent.putExtra("extra_data", data); startActivity(intent);
TextView tv = (TextView) findViewById(R.id.textView1); Intent intent = getIntent(); String data = intent.getStringExtra("extra_data"); tv.setText(data);
返回数据给上一个活动
startActivityForResult()方法接收两个参数,第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。
mainActiviyt
button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String data = "Hello WebActivity"; Intent intent = new Intent(MainActivity.this, WebActivity.class); startActivityForResult(intent, 1); } });
回调函数:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if (resultCode == RESULT_OK) { String returnedData = data.getStringExtra("data_extra"); Toast.makeText(getApplicationContext(), returnedData, Toast.LENGTH_SHORT).show(); } break; default: break; } }
WebActivity.java
button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("data_extra", "Hello MainActivity"); setResult(RESULT_OK, intent); finish(); } });
setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果。一般只使用 RESULT_OK或者RESULT_CANCELED这两个值,第二个参数则是把带有数据的Intent传递回去
onActivityResult()方法带有三个参数,第一个参数是requestCode,即我们在启动活动时传入的请求码。第二个参数resultCode,即我们在返回数据时传入的处理结果,第三个参数,data,即写在这返回数据的Intent
首先通过检查reaestCode的值来判断数据来源,确定数据来源之后,再通过resultCode的值来判断处理结果是否成功。
如果想通过back键返回数据,可以通过重写onBackPressed()方法来解决问题
更多相关文章
- 基于 Android(安卓)NDK 的学习之旅-----JNI 数据类型
- Android之SQLite数据库操作
- Android之Http通信
- Android(OPhone) 学习笔记 - SharedPreferences
- iScroll框架解析——Android(安卓)设备页面内 div(容器,非页面)over
- ContentProvider共享数据和ContentResolver的使用,Uri,UriMatche
- android studio + ndk + cmake + jna +sqlite c层报错SQLITE_CAN
- android 数据储存——--文件存储(2)
- Preference的使用