Android 活动间的穿梭 Intent

Android 活动间的穿梭 Intent

前言

尽管到了2017年,但是Android和iOS仍然是移动端的两大平台(笔者并不看好微信小程序,因为他它的局限性太强,我更把它看做是微信的二次推广),Android以它的开源、易上手、开发成本低而受到广大开发者的青睐,而iOS作为苹果的封闭系统,以它的简单、流畅高效、高冷等特点也吸引了一大批果粉开发者,笔者从入门到现在学习IOS已经有两年了吧,现在因为工作原因需要学习Android,刚好学习研究Android。目前刚刚学习Android的Intent,有一些心得体会,遂对比IOS,并根据一些资料结合自己的理解进行了总结,力求做到全面。其实,学习Android后发现二者还是有共同之处的,Android的Activity和IOS的Controller,二者都有单例模式,都可以使用文件或者NSUserdefauil来传值, 都有主线程的概念需要异步处理,都是面向对象的语言,都可以进行控件的布局,等等.当然我只是粗看了一遍,可能还会有更多的相似之处,本篇只针笔者自己对Intent的学习做出笔记,大神请多多指点。

显式 Intent 的使用

首先,显式的意思很明显就是直接了当,直接用构建好的Intent来启动目标活动,构建中的参数简单明了,直接上代码。
Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //显式intent Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); }
看到这段代码,我还比较熟悉,点语法嘛!FirstActivity.this这个参数可以看做启动第二个活动的上文,SecondActivity.class这个参数更加熟悉,Class一定就是目标活动了,所以说这是显式,参数直来来直往一目了然。

隐式 Intent 的使用

隐式的Intent构建的参数就不是直截了当了,而是指定了一系列抽象的action和category的信息,由系统去分析,并帮我们找到合适的活动去启动,所以隐式Intent的能力上限就很高了。

常规隐式Intent的使用

配置第二个活动的内容
<activity android:name=".SecondActivity"> <intent-filter> <action android:name="com.example.activitytest.ACTION_START" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
修改FirstActivity中的点击事件
Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //隐式intent Intent intent = new Intent("com.example.activitytest.ACTION_START"); startActivity(intent); }
可以看到这次我们直接把action的字符串传了进来,系统只要去寻找符合要求的活动去启动就可以。

其他的隐式Intent用法

刚说到隐式Intent的应用范围很广,使得我们不仅只是可以进行活动内部的启动,也可以调用系统的其他活动,比如浏览器,电话等。
下面是调用系统浏览器的代码:
Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //跳转到系统浏览器,也可用此方法跳转到系统的其他的功能界面,如:TEL,等 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent); }
这个Intent的action是Intent.ACTION_VIEW,这是一个系统内部的动作,Uri.parse是将字符串解析成Uri对象,再由Intent来启动这个活动,效果图如下:

Intent数据传递

正向传值

Intent 中提供了一系列的putExtra()方法的重载,所以我们想要正向传值只需要把想要传的数据写入到Intent中去,我们就可以把数据传入到下个界面。
在A活动加入一个字符串,
Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //正向传值 String a = "hello"; Intent intent = new Intent(FirstActivity.this,SecondActivity.class); intent.putExtra("extra_a",a); startActivity(intent); } }
在B活动将传递的数据取出来,这里使用putExtra()方法传递,需要注意接收的两个参数,第一个参数是键,第二个才是真正要传递的数据,
`public class SecondActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    Intent intent = getIntent();
    String a = intent.getStringExtra("extra_a");
    Log.d("SecondActivity",a);
}

}
`
打印结果,如下:

反向传值

既然有了正向传值,那么Intent能不能实现反向传值呢,答案是肯定的。Android返回上一个界面只需要Back一下就可以了,并不用Intent来启动一个活动来传递数据,那么该如何来反向传值呢?其实很简单,Activity中还有一个starActivityForResult()方法也是用来启动活动的,而且这个方法可以在活动注销时返回一个结果给上个界面,所以这就是我们需要的了!
修改A活动中的点击事件:
Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //startActivityForResult方法启动活动 Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivityForResult(intent,1); } }
为B界面添加点击事件并返回数据:
@Override protected void onCreate(Bundle savedInstanceState) { 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 FirstActivity"); setResult(RESULT_OK,intent); finish(); } }); }
当B注销时,回调A活动的方法:
@Override protected void onActivityResult(int requestCode,int resultCode,Intent data){ switch (requestCode){ case 1: if (resultCode ==RESULT_OK){ String returnedData = data.getStringExtra("data_return"); Log.d("FirstActivity",returnedData); } break; default: } }
结果为:

中间书写错误一次:
文件名 方法名 符号书写错误,会报错:Error:Execution failed for task ':app:compileDebugJavaWithJavac'.

Compilation failed; see the compiler error output for details.

小结

看了Android的活动跳转自己还真不适应...IOS要分模态视图跳转,导航控制器UINavigationController跳转,UITabBarController控制器跳转,感觉Android的Intent和IOS的模态跳转类似,而Android自带BACK也可以认为有IOS导航的影子,本人认为苹果的跳转更精细一些,特别是导航控制器,但是Intent的跳转更加大胆,还可以做一些系统内部的调用,而苹果一般是通过UIApplication来调用。至于传值,正向传值二者差不多,苹果也可以通过@property来完成,反向传值苹果的代理和BLOCK,也与intent中的回调方法有异曲同工之妙。
自己IOS开发还是个半吊子,就来学习Android鸭梨山大啊 ~ ~请各路大神指点哈!下一篇估计会写点Controlle和Activity的生命周期吧!

posted @ 2017-05-18 16:40  J0J0  阅读(190)  评论(0)    收藏  举报