zoukankan      html  css  js  c++  java
  • AndroidActivity详解与汇总

    注意的是,Activity的使用需要在Manifest文件中添加相应的<Activity>,并设置其属性和intent-filter。

    1、关于生命周期

    Activty的生命周期的也就是它所在进程的生命周期。


    <ignore_js_op>1.jpg 

    一个Activity的启动顺序:


      onCreate()——>onStart()——>onResume()

    当另一个Activity启动时:
      第一个Activity onPause()——>第二个Activity    onCreate()——>onStart()——>onResume() ——>第一个Activity   onStop()

    当返回到第一个Activity时:
      第二个Activity onPause() ——> 第一个Activity onRestart()——>onStart()——>onResume() ——>第二个Activity   onStop()——>onDestroy()

    一个Activity的销毁顺序:
    (情况一)onPause()——><Process Killed> 
    (情况二)onPause()——>onStop()——><Process Killed> 
    (情况三)onPause()——>onStop()——>onDestroy()
    PS:因此应在onPause()和onResume()做保存或者暂停动作!


      每一个活动( Activity )都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。

      但是当一个活动的状态发生改变的时候,开发者可以通过调用 onXX() 的方法获取到相关的通知信息。

      在实现 Activity 类的时候,通过覆盖( override )这些方法即可在你需要处理的时候来调用。


     一、 onCreate :当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。 
    onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调用 onSaveInstanceState ()方法保存的状态信息。
          
    二、  onStart :该方法的触发表示所属活动将被展现给用户。
     
    三、  onResume :当一个活动和用户发生交互的时候,触发该方法。
     
    四、  onPause :当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。
     
    五、  onStop :当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。
     
    六、onRestart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。
     
    七、 onDestroy :当活动销毁的时候,触发该方法。和 onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。
     
    onSaveInstanceState :系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。 
    通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。
     
    二、启动模式、Task
     
      这些启动模式可以在功能清单文件AndroidManifest.xml中进行设置,中的launchMode属性。
      
      相关的代码中也有一些标志可以使用,比如我们想只启用一个实例,则可以使用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 标志,这个标志表示:如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。
      Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
      startActivity(intent);
     
    四种加载模式的应用:
     
    比网上很多中文解释都要好!
    Use CasesLaunch ModeMultiple Instances?Comments
    Normal launches for most activities "standard" Yes Default. The system always creates a new instance of the activity in the target task and routes the intent to it.
    "singleTop" Conditionally If an instance of the activity already exists at the top of the target task, the system routes the intent to that instance through a call to itsonNewIntent() method, rather than creating a new instance of the activity.
    Specialized launches
    (not recommended for general use)
    "singleTask" No The system creates the activity at the root of a new task and routes the intent to it. However, if an instance of the activity already exists, the system routes the intent to existing instance through a call to itsonNewIntent() method, rather than creating a new one.
    "singleInstance" No Same as "singleTask", except that the system doesn't launch any other activities into the task holding the instance. The activity is always the single and only member of its task.

    文章 关于任务栈的应用:http://www.cnblogs.com/newcj/articles/1981964.html
     
    三、更新界面、多线程与传值

    Service通过广播Broadcast更新Activity UI

    http://www.eoeandroid.com/thread-68005-1-1.html

    Android中Activity、Service和线程之间的通信(包含Handler)

    Android线程交互(Handler+Thread 和 AsyncTask)博客园包含AsyncTask例子、知识汇总包含Handler例子

    http://blog.csdn.net/super005/article/details/5827298


    普通传值:Intent的使用
     
     
    四、小技巧

    Activity跳转页面切换漂亮效果 

    http://www.eoeandroid.com/thread-173334-1-1.html

    android 再按一次后退键退出应用程序

     1 private static Boolean isExit = false;
     2     private static Boolean hasTask = false;
     3     Timer tExit = new Timer();
     4     TimerTask task = new TimerTask() {
     5         
     6         @Override
     7         public void run() {
     8             isExit = false;
     9             hasTask = true;
    10         }
    11     };
    12     
    13     @Override
    14     public boolean onKeyDown(int keyCode, KeyEvent event) {
    15         System.out.println("TabHost_Index.java onKeyDown");
    16         if (keyCode == KeyEvent.KEYCODE_BACK) {
    17             if(isExit == false ) {
    18                 isExit = true;
    19                 Toast.makeText(this, "再按一次后退键退出应用程序", Toast.LENGTH_SHORT).show();
    20                 if(!hasTask) {
    21                     tExit.schedule(task, 2000);
    22                 }
    23             } else {
    24                 finish();
    25                 System.exit(0);
    26             }
    27         }
    28         return false;
    29     }

    捕获返回键,弹出是否确定退出应用的对话框

     1 @Override
     2  public boolean onKeyDown(int keyCode, KeyEvent event) {                
     3      if(keyCode == KeyEvent.KEYCODE_BACK){
     5            new AlertDialog.Builder(this)
     6                  .setIcon(R.drawable.icon)
     7                  .setTitle(R.string.app_name)
     8                  .setMessage(R.string.quit_desc)
     9                  .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
    10                          @Override
    11                          public void onClick(DialogInterface dialog, int which) {}})
    14                  .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
    15                          public void onClick(DialogInterface dialog, int whichButton) {
    16                                finish(); }
    18                  }).show();
    19                         
    20            return true;
    21      }
    22
    23    else{ 22 return super.onKeyDown(keyCode, event); 23 } 24 }

    让Activity变成一个窗口:Activity属性设定

    Xml代码

    android :theme="@android:style/Theme.Dialog"

    android:theme="@android:style/Theme.Dialog"

     让Activity变成半透明:Activity属性设定

    android:theme="@android:style/Theme.Translucent"

    android:theme="@android:style/Theme.Translucent"

    五、常见问题

      你后台的Activity被系统回收怎么办:onSaveInstanceState 。

      当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 
    这个时候A会执行。

    Java代码 

    public void onSaveInstanceState(Bundle outState) {   
        super.onSaveInstanceState(outState);   
        outState.putLong("id", 1234567890);   
    }  

    B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
    收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数
    savedInstanceState,没被收回的就还是onResume就好了。

    savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。

     

    Java代码


    if(savedInstanceState != null){   
         long id = savedInstanceState.getLong("id");   
    }  

    if(savedInstanceState != null){     long id = savedInstanceState.getLong("id");}


    就像官方的Notepad教程 里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦, 没准你需要记住滚动条的位置...

     

  • 相关阅读:
    c#中判断对象为空的几种方式(字符串等)
    log4net示例3控制台、windows事件
    c#中如何截取Windows消息来触发自定义事件
    向ArcGIS的ToolBarControl中添加任意的windows组建的方法
    log4net示例1最简单的回滚文件记录日志程序(时间)
    Qt 定时器实现循环
    把 MPP Sample 编译成动态库
    Linux Shell 常用编程语法
    VSCode 调试
    Hisi 使用GDB调试(直接调试)
  • 原文地址:https://www.cnblogs.com/TseChiHoi/p/2664221.html
Copyright © 2011-2022 走看看