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中组件的过度效果。
这里写图片描述

0 0
原创粉丝点击