精华内容
下载资源
问答
  • Android Activity详解

    万次阅读 多人点赞 2018-06-15 12:27:21
    Android Activity详解 1.什么是Activity Activity是一个Android的应用组件,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口,窗口可以充满哦屏幕也可以小于屏幕并浮动在其他窗口之上。 ...

    Android Activity详解

    1.什么是Activity

    Activity是一个Android的应用组件,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口,窗口可以充满哦屏幕也可以小于屏幕并浮动在其他窗口之上。

    一个应用通常是由多个彼此松散联系的Activity组成,一般会指定应用中的某个Activity为主活动,也就是说首次启动应用时给用户呈现的Activity。将Activity设为主活动的方法,如下面代码所示需要在AndroidManifest文件中添加以下内容

    <application>
         ....
        <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
         </activity>
         ....
    </application>      

    当然Activity之间可以进行互相跳转,以便执行不同的操作。每当新Activity启动时,旧的Activity便会停止,但是系统会在堆栈也就是返回栈中保留该Activity。当新Activity启动时,系统也会将其推送到返回栈上,并取得用户的操作焦点。当用户完成当前Activity并按返回按钮是,系统就会从堆栈将其弹出销毁,然后回复前一Activity

    当一个Activity因某个新Activity启动而停止时,系统会通过该Activity的生命周期回调方法通知其这一状态的变化。Activity因状态变化每个变化可能有若干种,每一种回调都会提供执行与该状态相应的特定操作的机会

    下面开始讲创建和使用Activity的基础知识(包括对Activity生命周期工作方式的全面阐述)

    2.创建Activity

    要创建Activity,必须创建Activity的子类。在子类中实现Activity在生命周期的各种状态之间转变时例如创建 Activity、停止 Activity、恢复 Activity 或销毁 Activity 时)系统调用的回调方法。Android Studio中新建项目默认创建的代码为

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    }

    onCreate()方法:必须实现的方法,系统在创建Activity时调用此方法。您应该在实现内初始化Activity的必要组件,必须在此方法调用setContentView(),用来定义Activity用户界面布局(XML文件)

    3.在清单文件中声明Activity

    每次新建的Activity都需要在AndroidManifest文件中添加如下内容,并将元素添加为元素的子项

    <manifest ... >
      <application ... >
          <activity android:name=".ExampleActivity" />
          ...
      </application ... >
      ...
    </manifest >

    4.启动Activity

    该部分用于描述如何启动Activity。作为主活动,在应用开启的时候就会系统创建,而用户不仅仅只需要主活动界面,用户需要界面的跳转,而界面的跳转也是其他活动界面(Activity)启动。

    在该部分仅仅只提及利用显示Intent方式跳转活动,代码如下

    Intent intent = new Intent(this, SignInActivity.class);
    startActivity(intent);
    //this,为本Acitivity的上下文;第二个参数为你要跳转的目的Activity.class

    如果需要了解更多的跳转方式可以看我后续的关于应用跳转与Intent使用博客.

    5.结束Activity

    通过调用Activity的finish()方法来结束Activity还可以通过调用finishActivity()结束之前启动的活动

    关于finishActivity()的理解:

    你通过 MainActivity 来启动 ActivityA (使用 startActivityForResult 方法),那么你在 MainActivity 这个类中需要重写 onActivityResult() 这个方法,
    然后,你可以在 onActivityResult() 中通过 finishActivity() 方法去结束掉 ActivityA

    6.管理Activity生命周期

    周期即活动从开始到结束所经历的各种状态。生命周期即活动从开始到结束所经历的各个状态。从一个状态到另一个状态的转变,从无到有再到无,这样一个过程中所经历的状态就叫做生命周期。

    Activity本质上有四种状态:

    1.运行(Active/Running):Activity处于活动状态,此时Activity处于栈顶,是可见状态,可以与用户进行交互

    2.暂停(Paused):当Activity失去焦点时,或被一个新的非全面屏的Activity,或被一个透明的Activity放置在栈顶时,Activity就转化为Paused状态。此刻并不会被销毁,只是失去了与用户交互的能力,其所有的状态信息及其成员变量都还在,只有在系统内存紧张的情况下,才有可能被系统回收掉

    3.停止(Stopped):当Activity被系统完全覆盖时,被覆盖的Activity就会进入Stopped状态,此时已不在可见,但是资源还是没有被收回

    4.系统回收(Killed):当Activity被系统回收掉,Activity就处于Killed状态

    如果一个活动在处于停止或者暂停的状态下,系统内存缺乏时会将其结束(finish)或者杀死(kill)。这种非正常情况下,系统在杀死或者结束之前会调用onSaveInstance()方法来保存信息,同时,当Activity被移动到前台时,重新启动该Activity并调用onRestoreInstance()方法加载保留的信息,以保持原有的状态。

    在上面的四中常有的状态之间,还有着其他的生命周期来作为不同状态之间的过度,用于在不同的状态之间进行转换,生命周期的具体说明见下。

    方法说明是否能事后终止?后接
    onCreate()首次创建 Activity 时调用。您应该在此方法中执行所有正常的静态设置 — 创建视图、将数据绑定到列表等等。始终后接onStart()onStart()
    onStart()此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见罢了。onStart()之后如果Activity转入前台,则后接 onResume() 如果 Activity 转入隐藏状态,则后接 onStop()。onResume()或 onStop()
    onResume()当此方法回调时,则说明Activity已在前台可见,可与用户交互了(处于前面所说的Active/Running形态),onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是后台无法与用户交互,而onResume则已显示在前台,可与用户交互。始终后接onPause()onPause()
    onPause()当前 Activity正在停止(Paused形态),系统即将开始继续另一个Activity时会调用此方法。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。 如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接 onStop()。onResume()或 onDestroy()
    onStop()在 Activity 对用户不再可见时调用。如果 Activity 被销毁或另一个Activity 继续执行并将其覆盖,就可能发生这种情况。如果Activity恢复与用户的交互,则后接onRestart(),如果Activity被销毁则后接onDestroy()onRestart()或 onDestroy()
    onDestroy()在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。当 Activity 结束(有人对 Activity 调用了 finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。
    onRestart()在 Activity 已停止并即将再次启动前调用。onStart()

    名为“是否能事后终止?”的列表示系统是否能在不执行另一行 Activity 代码的情况下,在方法返回后随时终止承载 Activity 的进程。

    这些方法共同定义 Activity 的整个生命周期。您可以通过实现这些方法监控 Activity 生命周期中的三个嵌套循环:

    • Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。您的 Activity 应在 onCreate()中执行“全局”状态设置(例如定义布局),并释放 onDestroy()中的所有其余资源。例如,如果您的 Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在onCreate() 中创建该线程,然后在onDestroy() 中停止该线程。
    • Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。例如,您可以在onStart() 中注册一个 BroadcastReceiver 以监控影响 UI的变化,并在用户无法再看到您显示的内容时在 onStop()中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart()onStop()
    • Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。Activity 可频繁转入和转出前台 — 例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

    7.例子验证Activity活动周期

    接下来就用一个小例子进行函数回调的验证

    代码很简单创建两个Activity以及相应的界面,每个界面只有一个按钮和TextView,按钮设置用来进行页面跳转的点击事件。每个回调函数内都有一个Log输出,所以验证的结果也是通过查看Logcat来进行查看,下面贴出MainActivity代码,所跳转的SecondActivity代码与之类似,故不贴出,只需在MainActivity代码上进行修改。

    package com.example.martinzou.android_exp_2;
    
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity {
        private Button button;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            Log.d("MainActivity","onCreate()被调用");
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button=(Button)findViewById(R.id.button1);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                    startActivity(intent);
                }
            });
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.d("MainActivity","onStart()被调用");
        }
    
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d("MainActivity","onResume()被调用");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d("MainActivity","onPause()被调用");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.d("MainActivity","onStop()被调用");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d("MainActivity","onDestroy()被调用");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.d("MainActivity","onRestart()被调用");
        }
    }

    设计的两个布局文件如下所示

    1.在手机上运行起来打开,查看Logcat如下图所示
    这里写图片描述
    手机加载应用至显示界面时,Activity启动–>onCreate()–>onStart()–>onResume()依次被调用。此时MainActivity处于可交互的状态。

    2.当我按下Home键时回到主界面时Logcat为
    这里写图片描述
    点击Home键回到主界面(Activity不可见)–>onPause()–>onStop()依次被调用。

    3.当点击Home键回到主界面后,再次点击App回到Activity时,Logcat结果如下
    这里写图片描述

    我们可以发现重新回到Activity时,调用了onRestart方法,onStart方法,onResume方法。因此,

    当我们再次回到原Activity时–>onRestart()–>onStart()–>onResume()依次被调用。

    4.当我按下返回键时,应用退出,MainActivity被销毁(Destroyed)
    这里写图片描述

    onPause()->onStop()->onDestroy()依次被调用,MainActivity被销毁。

    5.当加载应用进入主界面,并点击按钮进行页面跳转时,查看Logcat为
    这里写图片描述
    在原Activity调用了onPause()和onStop()方法,同时我们也发现了,在进行MainActivity进行完onPause()之后SecondActivity的生命周期方法才能被回调,所以这就是为什么onPause()方法不能操作耗时任务的原因了。

    6.当我们点击Back键回退时,Logcat结果为
    这里写图片描述
    点击之后SecondActivity的onPause()方法,onStop()方法,onDestroy()方法依次调用,MainActivity的onRestart(),onStart(),onResume()会依次调用。在进行SecondActivity进行完onPause()之后MainActivity的生命周期方法才能被回调。

    7.当我们点击SecondActivity界面中的按钮跳到MainActivity,Logcat为下图所示
    这里写图片描述
    会发现MainActivity并不会调用onRestart(),而是直接进行onCreate(),onStart(),onResume()的调用,跳转完毕之后SecondActivity并没有被销毁卫视处于onStop()状态,这表明SecondActivity()并没有被销毁。

    小结:当Activity启动时,依次会调用onCreate(),onStart(),onResume(),而当Activity退居后台时(不可见,点击Home或者被新的Activity完全覆盖),onPause()和onStop()会依次被调用。当Activity重新回到前台(从桌面回到原Activity或者被覆盖后又回到原Activity)时,onRestart(),onStart(),onResume()会依次被调用。当Activity退出销毁时(点击back键),onPause(),onStop(),onDestroy()会依次被调用,到此Activity的整个生命周期方法回调完成。

    作者:邹思源

    原文链接:https://blog.csdn.net/MartinZou/article/details/80115095

    展开全文
  • 关于Activity跳转动画的文章已经很多了,但大都不是很完善。首先官方支持的Activity跳转动画有几种不同的实现方式,大部分文章只介绍了其中一种。具体到每一种来说,实现上是很简单,但实际使用过程中还是会有一些...

    overridePendingTransition()是在Activity类中实现的一个用来实现跳转动画的方式,也是最常使用的方法。

    overridePendingTransition()

    先看这个名字,这个方法名很长,由三个单词组成,override是重写,覆盖的意思,pending表示即将到来的,transtition表示过渡,转换,也就是过渡动画的意思。三个单词连起来的意思就是覆盖即将到来的跳转动画,也就是可以通过这个方法添加的跳转动画会覆盖掉即将到来的跳转动画效果。即将到来的这个词很有意思,它表示即使不使用overridePendingTransition(),也会存在Activity切换动画,这个切换动画可能来自于其他方式添加的跳转动画,也可以来自于系统自带的默认动画。事实上,即使不通过本文介绍的任何方法添加Activity跳转动画,Activity也会有默认的跳转动画,这个默认的跳转动画定义在Android主题中。在android:Theme主题中可以看到这样一句样式定义,正是这句为App中所有Activity添加了一个默认的切换动画。

    <item name="windowAnimationStyle">@style/Animation.Activity</item>
    

    不过需要注意的是,@style/Animation.Activity中定义的动画样式在不同的系统版本上会有所不同,此外部分Theme自定义了新的windowAnimationStyle,所以默认的Activity动画并非一定是@style/Animation.Activity中定义的样子。

    overridePendingTransition()使用方法

    Activity的切换动画从业务层面上来说可以分为两种,一种是Activity启动时的动画,一种是从Activity返回时的动画,它们都可以通过overridePendingTransition()来设置,要设置启动时的动画需要在执行startActivity()或startActivityForResult()之后调用overridePendingTransition(),要设置返回时的动画需要在finish()之后调用overridePendingTransition()。启动动画和返回动画是相互独立的,设置启动动画不会对返回动画产生影响,如果只在startActivity()或startActivityForResult()之后调用了overridePendingTransition(),没有在finish()的时候调用,则Activity返回的时候仍然是默认的动画效果,也可以在finish()的时候使用和启动时不同的动画效果。

    由于startActivity()和startActivityForResult()本质上是一样的,为了表述方便,后文不再提到startActivityForResult(),所有使用startActivity()的地方都可以用startActivityForResult()。

    overridePendingTransition()只能作用在通过startActivity()和finish()方式启动和结束Activity的场景下,其他情况下的Activity创建和退出是不会有任何效果的。例如通过recreate()重建Activity,在其后执行overridePendingTransition()是没有动画效果的。

    overridePendingTransition()的调用时机

    注释和官方文档中关于此方法调用时机都写到“Call immediately after one of the flavors of startActivity(Intent) or finish to specify an explicit transition animation to perform next.”,也就是说此方法需要在startActivity() 或者finish()方法之后立即调用。因此标准的写法应当是这样的。注释和官方文档中关于此方法调用时机都写到“Call immediately after one of the flavors of startActivity(Intent) or finish to specify an explicit transition animation to perform next.”,也就是说此方法需要在startActivity() 或者finish()方法之后立即调用。因此标准的写法应当是这样的。

    在这里插入图片描述
    在这里插入图片描述

    对一个Android Activity来说,除了可以调用finish()来结束之外,它还可以被Android的返回键所结束。在按下返回键后,会执行到onBackPressed()方法,在onBackPressed()方法中会自动调用finish()方法结束Activity。所以在添加Activity返回动画时,除了要在所有调用finish()的地方调用overridePendingTransition()之外,还要重写onBackPressed()方法,在执行super.onBackPressed()之后调用overridePendingTransition()。由于onBackPressed()总是在最后一步执行finish(),所以如下代码和执行完finish()后调用overridePendingTransition()是等同的。

    在这里插入图片描述

    immediately的含义通常被理解为调用startActivity()或finish()之后的下一行代码就必须调用overridePendingTransition()才能让动画效果生效。但事实上overridePendingTransition()可以推迟到startActivity() 或finish()之后的某个地方执行。

    对启动Activity来说,overridePendingTransition()通常可以放到被启动Activity的onCreate()中来执行,很多文章都说overridePendingTransition()只能在调用super.onCreate()之前执行,这大部分情况是正确的,但并不是说overridePendingTransition()放到super.onCreate()之后就一定没有效果,事实上甚至可以把overridePendingTransition()放到onResume()来执行,这在很多时候是可以有效果的。

    对结束Activity来说,finish()之后的overridePendingTransition()执行时机要严格很多,首先并不能将overridePendingTransition()推迟到onDestroy()中执行,也不能在finish()和overridePendingTransition()之间执行一些耗时的代码,但增加一些简单的处理逻辑通常是不会有问题的。

    为了避免在不同设备上的差异,减少意外的发生,应当按照官方要求在startActivity() 或finish()方法之后立即调用overridePendingTransition(),对启动Activity来说,最迟应当放到被启动的Activity的onCreate()方法中执行super.onCreate()之前,对结束Activity来说,只能在finish()之后和super.onBackPessed()之后执行。

    如果在Activity还未显示完成就调用startActivity()启动另一个Activity,这时在startActivity()之后调用overridePendingTransition()来设置启动动画是不会有效果的,例如在onCreate()中调用startActivity()和overridePendingTransition()就不会有动画效果,这时连默认的动画效果都不会有,被启动的Activity会直接显示出来。

    overridePendingTransition()方法参数解析

    overridePendingTransition()方法的定义如下。

    public void overridePendingTransition(int enterAnim, int exitAnim)
    

    它包含两个参数,分别为enterAnim和exitAnim,它们都是定义在anim文件夹中的某个动画资源的id。overridePendingTransition()方法只有一个定义,没有其他重载的方法,也就是说overridePendingTransition()设置的动画效果只能通过anim资源的方式来定义,无法通过代码创建。

    enterAnim用来设置即将进入的Activity的动画效果,而exitAnim用来设置即将退出的Activity的动画效果。当从A启动B时,A是退出的Activity,B是进入的Activity,当从B返回A时则正好相反,A是进入的Activity,B是退出的Activity。也就是说,从A启动B时,B的动画效果是enterAnim,A的动画效果是exitAnim,从B返回A时,B的动画效果是exitAnim,A的动画效果是enterAnim。

    在Android系统自带了两组动画效果,分别为fade_in/fade_out和slide_in_left/slide_out_right。可以通过如下代码来使用。

    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
    
    overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
    

    设置有如下场景,有三个Activity,分别为A,B和C,A启动B,B启动了C,但B启动C的之后立刻调用了finish()结束了自己,代码如下。这里overridePendingTransition()既在startActivity()之后执行,又在finsh()之后执行,这时动画效果究竟会如何展现呢?

    Intent intent = new Intent(B.this, C.class);
    startActivity(intent);
    finish();
    overridePendingTransition(R.anim.anim_down_in, R.anim.anim_down_out);
    

    回答这个问题关键还在于理解overridePendingTransition()本身和enterAnim和exitAnim这两个参数的意义。
    在前面我们有提到,Activity的切换动画分为两种,一种是Activity启动时的动画,一种是从Activity返回时的动画,但对overridePendingTransition()来说,它其实并不区分这两种动画类型,无论在startActivity()之后还是在finish()之后执行,它的结果都是一致的,overridePendingTransition()只是为即将到来的Activity切换添加动画效果,也就是为即将进入的Activity执行enterAnim动画,为即将退出的Activity执行enterAnim动画。所以只需要知道上述场景下哪个是即将进入的Activity,哪个是即将退出的Activity即可。显然在上述场景下,C是即将进入的Activity,B是即将退出的Activity,所以动画效果就是C执行enterAnim,B执行exitAnim。

    上述enterAnim和exitAnim的值都允许为0,如果enterAnim值为0,表示没有enter动画效果,如果exitAnim为0表示没有exit 动画效果。如果两者都为0,则既没有enter动画效果,也没有exit动画效果,也就是不会有切换动画。但如果两个参数只有一个为0,则实际显示情况会比较复杂。

    这里仍以A和B两个Activity为例,首先看A启动B的时候,如果执行overridePendingTransition(0, R.anim.anim_down_out);,也就是enterAnim为0,它表示没有enter动画效果,这时B会直接显示出来,而exitAnim不为0,也就是说A会有一个down_out的动画效果,然而B的界面是覆盖在A之上的,那么显然即使A执行了down_out动画,也是无法看到这个效果的。所以这时从视觉上看是不会有任何动画效果的。我们知道Activity所依附的Window是存在背景的,正是这个背景使得我们无法透过当前Activity看到下层的Activity,那么如果将B设置为一个透明背景的Activity,是否意味着就可以看到A执行down_out的动画效果呢。实践结果告诉我们,如果B的背景是透明的,我们能够透过B看到A,但在B直接显示出来之后,A压根就没动,任何看不到任何动画效果。

    再来看overridePendingTransition(R.anim.anim_down_in, 0);,由于exitAnim为0,所以A是没有动画效果的,而B会有一个down_in的动画效果,这时在视觉上看到的会是B从底部升起,但在B逐渐升起的过程中,上面尚未被覆盖的部分并不能看到A的内容,而是一大块的黑色。这时如果B的背景是透明的,则会发现在B升起的过程中没有了黑色的部分,而是能够看到A的内容了。

    再来看Activity返回的时候,如果执行overridePendingTransition(0, R.anim.anim_down_out);,这时没有enterAnim效果,只有exitAnim,而B是那个退出的Activity,所以B会有一个动画效果逐渐往下退出,而在B退出的过程中我们也是看不到A的,能看到的只是上方的一大块黑色。这时如果B是透明的,则能看到A就一直显示在B的下方,一动不动。如果执行overridePendingTransition(R.anim.anim_down_in, 0);,我们会看到B直接不可见,A从下方升起,A升起过程中上面同样是黑色的背景。奇怪的是,如果这时将B背景设置为透明,并非黑色的背景被取代,而是整个动画过程不可见。

    上述过程总结如下。

    启动Activity返回Activity
    enterAnim为0B背景不透明:没有动画效果
    B背景透明:没有动画效果
    B背景不透明:B有动画效果,A不可见
    B背景透明:B有动画效果,A可见,A无动画效果
    exitAnim为0B背景不透明:B有动画效果,A不可见
    B背景透明:B有动画效果,A可见,A无动画效果
    B背景不透明:A有动画效果,B不可见
    B背景透明:没有动画效果

    在之前关于overridePendingTransition()动画的介绍中,都认为overridePendingTransition()动画是以Activity作为对象的,进入的Activity执行enterAnim,退出的Activity执行exitAnim,但如果是这样,上述现象有几个地方会无法解释。

    1. 在启动Activity,enterAnim为0,B背景透明时为何看不到A执行exitAnim
    2. 在返回Activity,extiAnim为0,B背景透明时,为何看不到A执行enterAnim

    为了理解上述现象,只能从源码去看overridePendingTransition()究竟是如何实现Activity切换动画的。跟踪了一下,无奈其实现实在是过于复杂,网上资料也几乎没有,所以这里只好对其原理做个推测了。

    1. overridePendingTransition()并没有对Activity实现动画,所有的动画都是在View层面执行的。
    2. overridePendingTransition()执行的动画始终都在B中,无论是从A启动B,还是从B返回A,A始终是不变的。当从A启动B时,A会将自身显示做一个快照,将这个快照对象传递给B。从B返回A时,所谓A的进入动画,仍然是使用之前A传过来的这个快照,并非使用A实时的显示。
    3. 在B中,A的退出和进入动画都是通过背景实现的,它会将A传过来的快照和黑色的背景拼接在一起,按照设定的动画效果来显示,所以如果将B的背景设置为透明,则整个背景变得不可见,所以不会有任何A的动画效果。这就解释了上述问题,当B背景透明时,是不会看到A执行extiAnim和enterAnim的。
    4. 在B中,B的进入和退出动画实际上是对BcontentView的动画效果
    展开全文
  • Android Activity调整改变成Dialog

    千次阅读 2018-05-09 19:24:02
    做一个style配置到style.xml,直接作为该Activityandroid:theme配置即可。具体的style: &lt;style name="DialogActivity" parent="@style/Theme.AppCompat.Dialog"&gt; &lt;...

    做一个style配置到style.xml,直接作为该Activity的android:theme配置即可。

    具体的style:

        <style name="DialogActivity" parent="@style/Theme.AppCompat.Dialog">
            <item name="android:windowFullscreen">true</item>
            <item name="android:windowFrame">@android:color/transparent</item>
            <item name="android:windowIsFloating">true</item><!--浮在其他Activity之上-->
            <item name="android:windowIsTranslucent">true</item><!--半透明-->
            <item name="android:windowNoTitle">true</item><!--无标题-->
            <item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
            <item name="android:backgroundDimAmount">0.5</item><!--透明度 0.0f到1.0f。1.0完全不透明,0.0f完全透明-->
        </style>

    在上层Java代码增加一个:

    setTitle(null);
    取消系统自己设置的标题。

    结果如图:


    展开全文
  • Android Activity的四种启动模式

    万次阅读 多人点赞 2018-12-18 23:06:12
    记得第一次探讨Activity的启动模式,是在2017年8月份,那个时候对一年后走出校门的未来很是憧憬,时间真快,已经毕业四个月,工作和生活也都趋于稳定。 一、小前言 相信很多人和我一样,在初学Android甚至初入...

    前言

    记得第一次探讨Activity的启动模式,是在2017年8月份,那个时候对一年后走出校门的未来很是憧憬,时间真快,已经毕业四个月,工作和生活也都趋于稳定。

    一、小前言

      相信很多人和我一样,在初学Android甚至初入职场的时候不了解Acticity的启动模式,或者为了面试刷题刷到了,但并不理解启动模式的作用,以及如何正确的使用启动模式而不是所有的都是用默认模式。

    二、Activity启动模式简介

    Activity有四种启动模式,standard、singleTop、singleTask、singleInstance,默认启动模式是standard

     2.1 standard 模式

    程序启动的时候,会默认创建一个任务栈,Activity是放在任务栈里面的,比如我们新建一个项目,默认生成一个ActivityA,那么此时任务栈是这样的:

    ,比如我们在ActivityA中有一个按钮,点击按钮跳转到ActivityB,ActivityB中有一个按钮,点击按钮跳转到ActivityC,那么此时该栈是这样的:

    那么如果在ActivityC中有个按钮跳转到ActivityB呢?没错,是再次创建一个ActivityB实例

    那么此时,我们点击返回键,会首先移除栈顶的ActivityB,回到ActivityC,在移除栈顶的ActivityC回到ActivityB,以此类推。

    当Activity全部退出时,系统会自动回收这个空栈。

    2.2 singleTop模式

    改变Activity的启动模式,可以在配置文件中为Activity添加lauchMode属性

    singleTop模式为栈顶复用模式,通俗的说,就是如果栈顶的Activity和启动的Activity的是同一个,那么就直接复用,比如还是在ActivityA中跳转到ActivityB,我们将ActivityB的启动模式设置为singleTop,因为当前栈顶是ActivityA,不是ActivityB,所以会创建新的ActivityB实例放入任务栈中

    现在我们在ActivityB中点击按钮跳转ActivityB,因为当前栈顶就是ActivityB所以会直接复用,此时栈内仍是ActivityB和ActivityA,此时点击返回按钮会直接退回到ActivityA。

    2.3 singleTask 模式

    singleTask是栈内复用模式,在这里栈内复用要区分要启动的Activity的所需栈是否是当前栈

    2.3.1 是当前栈

    比如现在有ActivityA 启动模式为singleTask ,在ActivityA中启动ActivityB,ActivityB在栈中不存在实例,则创建ActivityB实例,此时栈为:

    假设现在在ActivityB中启动ActivityA,会在当前栈中是否有ActivityA,若有则将ActivityA移到栈内,将位于ActivityA之上的移出栈顶,那么现在栈为:

    此时按返回键会直接退出程序,如果当前栈为

    我们现在启动ActivityB中启动ActivityA,则会将位于ActivityA栈顶的ActivityB、ActivityC以及ActivityB移出栈顶,此时栈内只是有ActivityA。

    2.3.1 不是当前栈

    不是当前栈的情况比较特殊,这里简单介绍

    假设当前任务栈是A,A栈中有ActivityA、ActivityB,在B中启动ActivityC,并且ActivityC所需的任务栈为B,栈B不存在所以会首先创建栈B,然后创建ActivityC实例放入栈B中

    那么我们如何指定启动的Activity所需的栈名称,这里就要说TaskAffinity参数,这里我们参考官方文档:
    https://developer.android.com/guide/topics/manifest/activity-element?hl=zh-cn#aff

    TaskAffinity可以理解为任务亲属性或相关性,默认情况下,应用中的所有 Activity 都具有相同的亲和关系

    默认任务栈的名字为应用包名,同样我们可以在配置文件中设置TaskAffinity属性,但必须和singleTask启动模式配对使用

    2.4 singleInstance模式

    singleInstance模式也是"栈内"复用模式,不过,比如现在当前栈中有ActivityA,我们在A中启动ActivityB,ActivityB的启动模式是singleInstance,此时会创建一个新的任务栈,创建ActivityB实例将ActivityB放在新的任务栈中

    2.5 Java代码设置启动模式

    除了在配置文件中,我们还可以通过在Java代码中设置启动模式

    intent.setFlags();

    singleTask 对应 FLAG_ACTIVITY_NEW_TASK

    singleTop 对应 FLAG_ACTIVITY_SINGLE_TOP

    欢迎关注技术公众号,微信号搜索ColorfulCode 代码男人

    分享技术文章,投稿分享,不限技术种类,不限技术深度,让更多人因为分享而受益。

    展开全文
  • android编程】第七讲-android Activity实践题 课堂笔记链接:https://blog.csdn.net/xbean1028/article/details/104904005 文章目录【android编程】第七讲-android Activity实践题1.Activity跳转练习1.0 题目要求...
  • activity进入方式 默认是右往左进入动画 1、下往上推进入动画——100与-100互换即可——上往下推进入动画 in: &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;set ...
  • Android Activity以Dialog的方式打开

    千次阅读 2018-06-16 22:55:52
    全屏样式的Activity1、AndroidManifest.xml 文件中,申明 activity 的主题使用自定义样式:@style/share_activity_styles&lt;activity android:name="com.ecej.ehome.ui.AppointmentTimeActivity" ...
  • android activity与fragment 的区别

    千次阅读 2019-07-24 19:11:14
    心里倒是觉得Fragment与Activity的区别我知道啊,编码的时候用的很多,感觉对这两个Android的主要控件也是很了解的,但是当时回答就糟透了,说了生命周期,其他巴拉巴拉的说了一通,fragment 生命周期少说了几个 ...
  • Android Activity(一)Activity间的跳转

    千次阅读 2019-05-27 02:22:38
    源码在最后: ...第一个Activity: public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btnone; @Override protected void onCreate(Bundle ...
  • 首先我们来说一下什么是生命周期 ...而我们的activity也是有生命周期的:被创建——&gt;被开始——&gt;被可视——&gt;被暂停——&gt;被停止——&gt;被销毁 这就是activity的...
  • 关于Android Activity之间传递数据的6种方式

    万次阅读 多人点赞 2018-11-07 21:14:46
    第一个Activity中 ? 1 2 3 4 5 6 //创建意图对象  Intent intent = new Intent(this,TwoActivity.class);  //设置传递键值对  intent.putExtra("data&...
  • AndroidActivity间参数传递

    万次阅读 2017-03-21 19:21:59
    完美讲解Activity间参数传递和互传
  • Android Activity生命周期和状态

    千次阅读 2017-04-14 18:34:13
    本文是读了《Android 群英传》第八章--ActivityActivity调用栈--之后的读书笔记,详情见书。  Activity算得上是Android里最常见也最重要的组件了,一般情况下都被翻译为“活动”,但实际上我一直都是把它理解为...
  • Android Activity的构造方法

    千次阅读 2017-02-07 20:04:54
    介绍Android Activity的构造方法及使用注意事项
  • Android Activity onNewIntent() 详解

    千次阅读 2019-08-09 17:10:34
    阅读更多 阅读难度:中阅读前提: 1. 需要了解 Android 的生命周期,每个方法的触发时机以及作用。...Android Activity 的生命周期如下(图片来自 Android 官网 https://developer.android.com/guide/component...
  • android activity进入退出动画自定义

    千次阅读 2016-06-21 17:21:58
    android activity进入退出动画自定义根据自己项目用到的总结了以下两种方法:方法一:自定义styles.xml文件,在AndroidManifest.xml清单文件中注册android:theme以实现动画,然后正常启动页面即可(application中...
  • 发现目前很多app应用,都具有左滑返回的功能,而且感觉体验很是愉快,尤其酷狗音乐左滑返回的...Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果 【AndroidActivity右滑返回的实现
  • android Activity 设置大小

    千次阅读 2017-03-22 14:59:18
    WindowManager m = getWindowManager(); Display d = m.getDefaultDisplay();...android.view.WindowManager.LayoutParams p = getWindow().getAttributes(); //获取对话框当前的参数值 p.height = (int)
  • android activity跳转时黑屏解决方案

    千次阅读 2017-05-17 18:43:20
    当我们做activity跳转时,有时是需要自定义跳转动画的,当我们自定义跳转动画后,会发现跳转过程中新的activity背后是黑漆漆的 这对用户体验很差 解决办法: 1.首先先定义一个style name="MyAppTheme" parent=...
  • unity 中启动Android activity

    千次阅读 2018-05-10 13:23:49
    这个时候我想添加一个新的activity来实现一些android层面的代码。怎么办?常规做法,找到sdk里面的源码在android IDE里面编译,添加自己想要加的activity,在导出jar。但是。我没有sdk源码。也不想看他里面结构。...
  • Android Activity返回键控制的两种方式

    千次阅读 2017-11-23 17:00:40
    Android Activity返回键控制的两种方式 Android Activity返回键监听的两种方式 1、覆写Activity的OnBackPressed方法 官方解释: Called when the activity has detected the user's press of the back key. ...
  • Android Activity

    千次阅读 2019-07-11 21:31:48
    Activity创建 1、新建类继承Activity或其子类 2、在AndroidManifest中声明 3、创建layout并在Activity的onCreate中设置 Activity属性 //没有actionbar android:theme="@style/Theme.AppCompat.NoActionBar" //竖屏...
  • Android activity-alias

    千次阅读 2016-11-02 19:39:58
    Android 中 meta-data 用在 AndroidManifest.xml 文件中。标签是提供组件额外的数据用的,它本身就是一个键值对(Bundle),可以自定义名称和值(value或resource)。它可以包含在以下6个组件中: <activity> ...
  • public class ActivityUtils { /** * 判断某个界面是否在前台 ... * @param activity 要判断的Activity * @return 是否在前台显示 */ public static boolean isForeground(Activity activity) { ...
  • android activity显示不出布局

    千次阅读 2016-04-06 10:06:21
    当一个activity跳转到另一个activity时,显示不出布局,全是一片白或是一片黑, 或者是直接的activity显示不出布局出来。 原因: onCreate方法用错了。 在activity里面onCreate方法有2个,如下 @Override ...
  • 在下列所有说明中 只有两个Activity A 和 B,并且B是通过A启动的。 A启动B 很简单 就两行 在Activity A中, 启动 Activity B intent = new Intent(ActivityA.this,ActivityB.class); startActivity(intent); ...
  • activity在竖屏的时候,顶部会有状态栏,顶部会有ToolBar,现在需求是,旋转屏幕以后,横屏状态下 整个界面是以全屏状态显示,隐藏ToolBar,不显示屏幕最顶部的状态栏首先,在AndroidManiFest里面设置Activity的属性...
  • 关于Activity动画那些事关于activity的动画,相信大家再熟悉不过了,我们开发中经常用到,网上资料也很多,但是也有一些小细节需要我们注意,今天这篇文章我总结了几种常用的动画实现方式,通过这篇文章,你可以了解...
  • 1.在res/valuse/styles.xml中添加如下代码<!--是否显示标题 窗口背景 透明 窗口是否透明--> <item name="android:windowNoTitle">true</item

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 824,197
精华内容 329,678
关键字:

androidactivity