Activity生命周期,启动模式LaunchMode,碎片Fragment,Intent跳转传递

1 篇文章 0 订阅
1 篇文章 0 订阅

一、Activity生命周期(启动模式为默认的情况)

         startActivity主要可以让目标界面入栈(移到栈顶)

         导致:当前的Activity进入stop状态,目标界面将会从onCreate-->onStart-->onResume-->运行

 

         返回键或者finish,会导致当前的Activity出栈(onPause-->onStop-->onDestroy)

 

         Activity只要还在栈中但是不可见都处于onStop状态。


 二、启动模式

         android:launchMode="standard"默认

         singleTop:如果目标已经在栈顶,则不再创建,而是触发该Activity的onNewIntent

         singleTask:将目标页面放到新的栈中(Task),一般要结合android:taskAffinity="abc123",并且目标名称不能跟应用包名一样

         singleInstance:将目标放到新栈中跟singleTask是类似的,只是跳转的目标如果在原来的栈中则将会在原来的基础上创建,如A B C在C中启动D(singleInstance),此时D在新的Task中,如果D->C 时原来的栈情况为A B C C

 

三、Fragment

         Fragment是3.0之后新增的api,作用是依赖于Activity,为Activity分担一些界面交互/显示相关的事情,不能独立存在。

         xml添加:

         <fragment

       android:layout_width="match_parent"

       android:layout_height="200dip"

       android:name="com.xyy.fragmentdemo.TitleFragment"/>

         特性:跟Activity的生命周期同步

 

         FragmentManager动态的管理:可以使用FragmentManager的beginTransation方法得到FragmentTransation对象来管理Fragment的add、remove、replace、show、hide、attach、dettach

管理方式如下:

          ContentFragment fragment =ContentFragment.newInstance(str);

       //Fragment的操作需要FragmentTransation

       FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

         //  ft.replace(R.id.content_layout,fragment);  //处理替换(新的Fragment对象进来旧的出去)

       ft.add(R.id.content_layout,fragment);

       //将变化记录到回退栈

       ft.addToBackStack("abc");

       //提交操作

       ft.commit();

注意:Fragment操作完成时需要commit或者commitAllowingStateLoss才有效果

使用FragmentTransation中的ft.addToBackStack("abc");的方法可以将操作的Fragment记录到回退栈中。

如果要获取回退栈的Fragment数量可以使用如下代码获取:    

          FragmentManager fm =getSupportFragmentManager();

    //获取回退栈中Fragment的数量

    int num = fm.getBackStackEntryCount();

    Log.e("m_tag","num:"+num);    

注意:如果有Fragment1嵌套了Fragment2这种情况,那么在Fragment1中获取FragmentManager时,需要使用getChildFragmentManager()这个方法,如果在Activity(FragmentActivity)中管理Fragment的管理器获取方式为getSupportFragmentManager(),在Activity中的其他Fragment里管理Activity中的Fragment那么FragmentManager的获取方式为:getFragmentManager()

 

*Fragment和Activity之间传递内容

         Activity向Fragment传递:可以再Activity中使用FragmentManager的findFragmentById或者findFragmentByTag方法获取Fragment对象,然后通过fragment对象.方法()

         Fragment向Activity中传递:可以再Fragment中使用getActivity()方法获取到所依赖的Activity对象,然后可以通过对象.方法传递

         另外也可以在Fragment中设计一个回调interface,然后在需要返回数据的地方使用接口对象返回,然后Activity去实现即可

         如:

         Fragment中:

          public void load() {

       Log.e("m_tag", "加载数据...");

       new Thread() {

           @Override

           public void run() {

                super.run();

                try {

                    Thread.sleep(10000);

                } catch (InterruptedExceptione) {

                    e.printStackTrace();

                }

                //加载完了

                if (null != onLoadListenr) {

                    onLoadListenr.onLoadOk("abc123");

                }

           }

       }.start();

    }

 

   public interface OnLoadListenr {

       void onLoadOk(Object result);

    }

 

   private OnLoadListenr onLoadListenr;

 

   public void setOnLoadListenr(OnLoadListenr onLoadListenr) {

       this.onLoadListenr = onLoadListenr;

    }

 

         Activity:

          TitleFragment fragment = (TitleFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_title);

       fragment.setOnLoadListenr(new TitleFragment.OnLoadListenr() {

           @Override

           public void onLoadOk(Object result) {

               Log.e("m_tag","Activity收到的内容:"+result);

           }

       });

===========================================================

四、Intent

-->ComponentName组件描述信息:可以描述Intent内容传递的目标组件。

         应用内部跳转

         Intentit = new Intent();

    //通过组件名这个内容来配置Intent的目标

   ComponentName cn = newComponentName(MainActivity.this,Activity01.class);

         //ComponentName cn = newComponentName(MainActivity.this,"com.xyy.intentdemo.Activity01");

    it.setComponent(cn);

   startActivity(it);

 

         跨应用跳转

          Intent it1 = new Intent();

          //第一个参数表示跳转到的目标应用,第二个参数表示跳转到的界面

    ComponentName cn1 = newComponentName("com.xyy.webviewdemo","com.xyy.webviewdemo" +".MainActivity");

    it1.setComponent(cn1);

     startActivity(it1);

         注意:跨应用跳转的目标必须是一个入口界面(Main,Send,View)

 

-->Action

         Action:描述Intent内容传递的一些行为,一般结合intent-filter一起使用。

         需要在组件(Activity、Service)声明的时候使用<intent-filter>标签添加行为过滤,如:

         <activityandroid:name=".Activity01">

           <intent-filter>

                <actionandroid:name="abc123"/>

                <categoryandroid:name="android.intent.category.DEFAULT"/>

           </intent-filter>

   </activity>

         启动时可以配置Action字符串即可启动,如:

         Intentit3 = new Intent("abc123");

         //it3.setAction("abc123");

   startActivity(it3);

 

-->Data和Type

         Data和Type:描述Intent传递的数据和类型(Uri)

         结合Action实现分享

         需要分享界面(接收端)要有过滤

          <activity

           android:name=".ShareActivity"

           android:label="那个啥">

           <intent-filter>

                <actionandroid:name="android.intent.action.SEND"/>

                <actionandroid:name="android.intent.action.SENDTO"/>

                <dataandroid:mimeType="text/*"/>

                <dataandroid:mimeType="image/*"/>

                <categoryandroid:name="android.intent.category.DEFAULT"/>

           </intent-filter>

       </activity>

         发送端,使用数据以及类型组装一个Intent目标,然后列出选择

         IntentshareIntent = new Intent(Intent.ACTION_SEND);

   shareIntent.putExtra(Intent.EXTRA_TEXT,"Hello World");

    //配置要找系统中能发送文本的Activity

         //shareIntent.setType("text/plain");

   Uri uri = Uri.fromFile(new File("/mnt/sdcard/temp.jpg"));

   shareIntent.setDataAndType(uri,"image/jpeg");

    //已选择框形式列出用户要分享到的Activity

    Intent intent = Intent.createChooser(shareIntent,"分享到");

    startActivity(intent);

        

-->Extras

         Extras:(Bundle)传递的一些键值对数据(基本数据类型/String/序列化对象/序列化集合)。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值