前面两节所有应用都是同一个activity中的,是时候讲activity之间交互的操作了,此后会涉及到intent这个概念,这也算一个新的里程碑开始。

主要内容包括intent的使用,以及activity之间的数据传递。

假设有两个activity,MainActivity跟SecondActivity,其中MainActivity是主活动,现在MainActivity需要调用SecondActivity,则可以用以下两种方式。

1.activity跳转

(1)显示intent:使用显示intent,需要增添的配置只有调用方的activity

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
final Button btn_intent = (Button) findViewById(R.id.intent_btn); btn_intent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
...
}

如上述代码,通过点击btn_intent这个button,就可以调用SecondActivity。Intent(Context packageContext, Class<?> cls) 。这个构造函数接收两个参数,第一个参数 Context 要求提供一个启动活动的上下文,第二个 参数 Class 则是指定想要启动的目标活动,通过这个构造函数就可以构建出 Intent 的“意图”。 调用意图,使用startActivity即可。

(2)隐式intent

使用隐式intent可以不用指定activity,而只需要调用action name即可。

首先在AndroidManifest.xml中配置action跟category,这两者可以组成intent的过滤器

        <activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<!--<category android:name="android.intent.category.DEFAULT" />-->
<category android:name="com.example.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>

当MainActivity需要调用SecondActivity时,可以调用intent的另一个构造方法

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
final Button btn_intent = (Button) findViewById(R.id.intent_btn); btn_intent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
#如果category配置的是default,则此处可以不用加category
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
});
}
...
}

ps:隐式调用更像是前端中常用的模式,通过给activity标示唯一识别符,然后需要用到时则通过唯一识别符来调用。而不用像显式调用那样,在编码时必须熟知调用的主从关系。

另外隐式调用的好处是隐式调用不仅可以启动自己程序内的活动,还可以启动其他程序的活动, 这使得 Android 多个应用程序之间的功能共享成为了可能。

(3)程序间的调用(隐式调用+)

        sys_btn_intent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});

其中ACTION_VIEW代表调用的是系统本身的activity

2.activity间数据传递

(1)数据传递

MainActivity中有一个字符串,现在想把这个字符串传递到SecondActivity,可以用putExtra跟getStringExtra在activity之间传递数据

MainActivity需要传递data给SecondActivity,具体使用如下:

MainActivity(sender):

        button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = " hello world!";
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("extra_data",data); //{"extra_data":data}
startActivity(intent);
}
});

SecondActivity(receiver):

public class SecondActivity extends Activity {

    @Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout); //通过intent获取数据
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Toast.makeText(SecondActivity.this,data,Toast.LENGTH_SHORT).show(); }
}

(2)数据返回

因为数据返回,一般是activity的销毁,而不是调用,因此跟(1)中的方式不一样。假设现在需要从SecondActivity返回数据给MainActivity:

SecondActivity

public class SecondActivity extends Activity {

    @Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout); Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello MainActivity");
//绑定result_code跟intent内容
setResult(RESULT_OK,intent);
finish();
}
}); }
}

MainActivity需要接受的参数有:一个是request_code,一个是result_code,最后一个是intent。

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
final Button button = (Button) findViewById(R.id.button_1); button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, 200);
}
});
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
switch (requestCode){
case 200:
if (requestCode == RESULT_OK){
String returnedData = data.getStringExtra("data_return");
Log.d("MainActivity", returnedData);
}
break;
default:
}
}
...
}

3.在Bundle中传递跟保存数据

Bundle中传递跟保存数据是为了防止activity调用时,当前activity如果需要在onDestory时保存一些临时数据,则可以用onSaveInstanceState这个构造函数。

保存数据:

    @Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key",tempData);
}

取出数据:

public class ActivityLifeCycleTest extends AppCompatActivity {

    public static final String TAG = "MainActivity";

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
Toast.makeText(ActivityLifeCycleTest.this,TAG+"===onCreate==",Toast.LENGTH_SHORT).show();
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_activity_life_cycle_test);
if (savedInstanceState != null){
String data = savedInstanceState.getString("data_key");
Log.d(TAG, data);
}
...
}

android第一行代码-3.activity之间的调用跟数据传递的更多相关文章

  1. 《Android第一行代码》笔记

    学习Android开发差点儿相同有两年时间了.期间也做了大大小小的一些项目.近来抽出闲暇想把Android基础强化一下,之前在网上看到了郭霖郭大神的几篇博客.从中受益不少.于是花了近一周时间看完了郭神 ...

  2. Android 第一行代码(第二版)分享

    今天从网上好不容易看到了别人转发的pdf版的 第一行代码通过下载我把它存在了百度云里面了与大家共享 http://pan.baidu.com/s/1bRztF4

  3. android第一行代码-2.activity基本用法

    摘要: 本节主要涉及到的有activity的创建,标题栏隐藏,button绑定方法(toast的使用),menu使用,活动销毁 1.activity的创建跟注册 创建: public class Te ...

  4. 1.3.4分析你的第一个Android程序——Android第一行代码(第二版)笔记

    切换项目结构模式 Project模式的项目结构 我们将项目切换成Project模式,这就是真实的目录结构. .gradle和.idea 这两个目下放置的都是Android Studio自动生成的一些文 ...

  5. android第一行代码-1.项目结构

    0.项目结构 一个简单的android项目结构大致如下 入口就是MainActivity这个类,如果对于一个陌生的项目,最好的办法是看AndroidMainifest.xml,如下 <?xml ...

  6. android第一行代码-6.自定义控件的实现

    0.假设一个应用中标题栏控件都是共用的,如果每个activity都需要设置button,绑定方法,那代码就会很臃肿.那我们可以自定义控件,然后继承这个控件就行了. 自定义控件为TitleLayout, ...

  7. Android 第一行代码

    ::-/stuapplication.pla.edu.cn.fragmentbestpractice W/dalvikvm﹕ VFY: unable to find class referenced ...

  8. (Android第一行代码实验一)活动的最佳实践

    活动的最佳实践    1.知晓当前是在哪一个活动         这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个活动.  首先需要新建一个 BaseActivity 继承自 Activi ...

  9. alexkn android第一行代码-8.sqlite使用

    Android自带sqlite数据库,因此常见操作应该都掌握.包括数据库的创建/升级以及增删改查. 1.创建数据库 public class MyDatabaseHelper extends SQLi ...

随机推荐

  1. struts通过action返回json

    其实struts2通过action返回json挺简单的,但是就是老要忘,所以索性写在博客上.好的,开始. 首先是引入必须的jar包: struts2-json-plugin-2.3.24.jar 然后 ...

  2. 从零开始学 Java - Spring MVC 实现跨域资源 CORS 请求

    论职业的重要性 问:为什么所有家长都希望自己的孩子成为公务员? 答:体面.有权.有钱又悠闲. 问:为什么所有家长都希望自己的孩子成为律师或医生? 答:体面.有钱.有技能. 问:为什么所有家长都不怎么知 ...

  3. Netty(四)分隔符与定长解码器的使用

    TCP以流的形式进行数据传输,上层的应用协议为了对消息进行划分,往往采用如下的4种方式. (1)消息长度固定,累计读到长度总和为定长len的报文后,就认为读取到了一个完整的消息:然后重新开始读取下一个 ...

  4. javascript组合继承

    javascript继承有几种继承方式,现在来说说其中的组合继承. 组合继承是结合了原型链和借用构造函数这两种技术的继承方式,分别利用它们的长处,避免了短处.那就先说说这两种技术吧. 原型链  原型链 ...

  5. CSS3——3D旋转图(跑马灯效果图)

    CSS3新增了很多新的属性,可以用很少的代码实现炫酷的动画效果,但由于兼容性各浏览器的能力存在不足,有特别需求的网站就呵呵啦.H5C3已是大势所趋了,之前看过一个新闻,Chrome将在年底全面转向H5 ...

  6. 浅谈网站web框架的本质

    一.web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. import socket def handle_reques ...

  7. SharePoint Framework:下一代开发方式

    SharePoint Framework(SPFx),是页面 和Webpart的模型,完全支持本地开发(即完全可以脱离SharPoint环境在本地进行开发),听起来是不是很高级呢,早期SharePoi ...

  8. ERP入门

    为什么想起写这个题目哪?其实这个问题很久就想写了,记得2005年时候,公司新招的二位刚毕业的大学生,一个专业是经济管理,一个是会计,东北大区培训后公司让我选择了一位带一带,我选择了一个会计专业的(因为 ...

  9. android中的回调请求的个人理解

    Fragment类提供了管理"选项菜单"的回调函数onCreateOptionMenu(Menu,MenuInflater),调用它可以--创建"选项菜单". ...

  10. 总结一下Android中主题(Theme)的正确玩法

    在AndroidManifest.xml文件中有<application android:theme="@style/AppTheme">,其中的@style/AppT ...