Android_聊一聊Activity(二)
来源:互联网 发布:卡通设计软件 编辑:程序博客网 时间:2024/06/05 23:56
其实,这篇文章中的内容本来想和Android_聊一聊Activity(一)放到一起的,但想想自己每次看别人的文章一看到一望无际的scrollbar就头疼的情景,还是另起一篇吧。上一篇聊到的activity几乎是我们每个人都知道的东西,这篇就来聊聊我们可能会忽略但同样重要实用的知识点。
1. Intent和Intent-filter
Intent是抽象的数据结构,它存储了一系列用以描述某个操作的数据。我们可以通过startActivity(Intent)启动一个新的activity,sendBroadcast(Intent)发送广播给需想要接收广播的组件,startService(Intent)启动一个服务,bindService(Intent)绑定一个服务。Intent是各个组件之间通信的纽带。Intent有两种调用方法。
显式的Intent:
Intent intent = new Intent(mActivity, TestActivity.class);startActivity(intent);
调用Intent时,直接指明了Intent的接收者,即TestActivity.class
隐式的Intent
Intent intent = new Intent();intent.setAction("www.baidu.com");startActivity(intent);
即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,有利于降低发送者和接收者之间的耦合,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间,上面那个intent, 没有指明接收者, 只是给了一个action作为接收者的过滤条件。
IntentFilter就是用于描述intent的各种属性, 比如action, category等
关于IntentFilter的几点注意事项:
1. android.intent.action.MAIN、android.intent.category.LAUNCHER
android.intent.action.MAIN决定一个程序最先启动哪个组件.
android.intent.category.LAUNCHER决定该程序是否在程序列表中显示,即在桌面是否显示APP的图标
这两个属性组合情况:
第一种情况:有MAIN,无LAUNCHER,程序列表中无图标
原因:android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里
第二种情况:无MAIN,有LAUNCHER,程序列表中无图标
原因:android.intent.action.MAIN决定应用程序最先启动的Activity,如果没有Main,则不知启动哪个Activity,故也不会有图标出现
所以这两个属性一般成对出现。
如果一个应用中有两个组件intent-filter都添加了android.intent.action.MAIN和
android.intent.category.LAUNCHER这两个属性, 则这个应用将会显示两个图标, 写在前面的组件先运行。
2. 关于隐式Intent
每一个通过 startActivity() 方法发出的隐式 Intent 都至少有一个 category,就是 “android.intent.category.DEFAULT”,所以只要是想接收一个隐式 Intent 的 Activity 都应该包括 “android.intent.category.DEFAULT” category,不然将导致 Intent 匹配失败.
比如说一个activity组件要想被其他组件通过隐式intent调用, 则其在manifest.xml中的声明如下:
<activity android:name="com.gesture.QGestureListActivity"> <intent-filter> <action android:name="com.google.test" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
3.关于intent-filter匹配优先级
首先查看Intent的过滤器(intent-filter),按照以下优先关系查找:action->data->category
4.android.intent.category.LAUNCHER与android.intent.category.HOME的区别
android.intent.category.LAUNCHER:android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里,就是android开机后的主程序列表。
android.intent.category.HOME:按住“HOME”键,该程序显示在HOME列表里。
2. Activitiy过渡动画体验
1. 使用overridePendingTransition方法实现Activity跳转动画。
overridePendingTransition方法是Activity中提供的Activity跳转动画方法,通过该方法可以实现Activity跳转时的动画效果,overridePendingTransition在startActivity或者是finish方法立刻执行才有效,简单例子如下:
Intent intent =newIntent(MainActivity.this, SecondActivity.class);startActivity(intent);overridePendingTransition(R.anim.slide_in_left, R.anim.slide_in_left);
2. 使用Style自定义Activity的切换动画
(1) 定义Application的style
<application Android:allowBackup="true"Android:icon="@mipmap/ic_launcher" Android:label="@string/app_name" Android:supportsRtl="true" Android:theme="@style/AppTheme">
(2) 定义具体的AppTheme样式
其中这里的windowAnimationStyle就是我们定义Activity切换动画的style。而@anim/slide_in_top就是我们定义的动画文件,也就是说通过为Appliation设置style,然后为windowAnimationStyle设置动画文件就可以全局的为Activity的跳转配置动画效果。
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimary</item> <item name="android:textColorPrimary">@color/white</item> <!-- 窗口的背景颜色 --> <item name="android:windowBackground">@android:color/white</item> <item name="android:windowActionBar">false</item> <item name="android:windowNoTitle">true</item> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="android:windowAnimationStyle">@style/MyActivityStyle</item></style><!-- activity切换动画 --><style name="MyActivityStyle" > <!-- 用于设置打开新的Activity并销毁之前的Activity展示的动画 --> <item name="android:activityOpenExitAnimation">@anim/out_to_left</item> <!-- 用于设置打开新的Activity并进入新的Activity展示的动画 --> <item name="android:activityOpenEnterAnimation">@anim/in_from_right</item> <!-- 用于设置关闭当前Activity时展示的动画 --> <item name="android:activityCloseExitAnimation">@anim/out_to_right</item> <!-- 用于设置关闭当前Activity进入上一个Activity展示的动画 --> <item name="android:activityCloseEnterAnimation">@anim/in_from_left</item></style>
3. 使用ActivityOptions切换动画实现Activity跳转动画
通过overridePendingTransition方法基本上可以满足我们日常中对Activity跳转动画的需求了,但MD风格出来之后,overridePendingTransition这种老旧、生硬的方式怎么能适合我们的MD风格的App呢?google在新的sdk中给我们提供了另外一种Activity的过度动画——ActivityOptions。并且提供了兼容包——ActivityOptionsCompat。ActivityOptionsCompat是一个静态类,提供了相应的Activity跳转动画效果,通过其可以实现不少炫酷的动画效果。我们需要设置全局跳转动画。
(1) 编写过度动画文件
首先我们需要在Application项目res目录下新建一个transition目录,然后创建资源文件,然后使用这些系统自带的过渡动画效果,这里设置了过度时长为300ms。
<explode xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:duration="300" />
(2) 定义style文件
<!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="Android:windowEnterTransition">@transition/activity_explode</item> <item name="Android:windowExitTransition">@transition/activity_explode</item> </style>
(3) 执行跳转逻辑
/** * 调用ActivityOptions.makeSceneTransitionAnimation实现过度动画 */ Intent intent = new Intent(MainActivity.this, FourActivity.class); startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
4. 使用ActivityOptions动画共享组件的方式实现Activity跳转
这里的共享组件动画效果是指将前面一个Activity的某个子View与后面一个Activity的某个子View之间有过渡效果,即在这种过度效果下实现Activity的跳转操作。那么如何实现两个组件View之间实现过渡效果呢?
(1) 定义共享组件
在Activity a中的button按钮点击transitionName属性:
<Button android:id="@+id/button5" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/button4" android:layout_marginTop="10dp" android:layout_marginRight="10dp" android:layout_marginLeft="10dp" android:text="组件过度动画" android:background="@color/colorPrimary" android:transitionName="shareNames" />
在Activity b的布局文件中为组件定义transitionName属性,这样这两个组件相当于有了过度对应关系,这里需要注意的是这两个组件的transitionName属性的值必须是相同的。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:Android="http://schemas.android.com/apk/res/Android" android:id="@+id/activity_second" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" android:transitionName="shareNames" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorAccent" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" /></LinearLayout>
(2)调用startActivity执行跳转动画
点击按钮,实现Activity的跳转操作 * 通过Android5.0及以上共享组件的方式实现activity的跳转动画
Intent intent = new Intent(MainActivity.this, FiveActivity.class); startActivity(intent, ActivityOptions.makeSceneTransitionAnimation( MainActivity.this, button5, "shareNames").toBundle());
需要说明的是这里调用的ActivityOptions.makeSceneTransitionAnimation方法,传递了三个参数,其中第一个参数为context对象,第二个参数为启动Activity的共享组件,第三个参数为启动Activity的共享组件transitionName属性值。
这样经过调用之后我们就实现了从Activity a跳转到Activity b的时候a中的组件到b中组件的过度效果。
- Android_聊一聊Activity(二)
- Android_聊一聊Activity(一)
- android_多activity
- Android_实现activity之间切换的动画效果(overridePendingTransition)
- 【android_温故知新】深入理解 Activity
- Android_四大组件之一Activity
- Android_访问网络二(使用HttpClient访问)
- 初学Android_方法总结(二)
- Activity生命周期(二)
- Android Activity(二)
- Activity生命周期(二)
- activity(二)
- Activity生命周期(二)
- Activity入门(二)
- Activity详解(二)
- Activity生命周期(二)
- android_定义多个Activity及跳转
- android_不显示界面的activity调用
- spring 笔记2 PropertiesLoaderSupport
- 请求http出错问题修改plist
- 正则表达式
- 如何读懂一篇学术论文?
- 定时器quartz的配置与测试
- Android_聊一聊Activity(二)
- wells 效果 (Bootstrap)
- 轻松搞定Math.ceil,Math.round,Math.floor三者的区别
- Android开发中文站 » Android酷炫实用的开源框架(UI框架)
- 位运算符
- hadoop2.6完全分布式环境搭建(下-->配置文件)
- 数据库设计冗余字段
- php将十六进制转义序列转换成字符串
- NPOI 导出Excel