【android,14】14.为应用程序多个activity的应用和数据的传输

来源:互联网 发布:python scatter 气泡 编辑:程序博客网 时间:2024/04/24 20:20

一、创建一个自定义界面:

1、自定义一个Activity类 要继承系统的Activity类。

public classDemo2Activity extends Activity {

 

    public void onCreate(BundlesavedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main2);  //指定布局

    }

}

 

2、在清单文件AndroidManifest.xml中声明一个activity元素

 <application

       android:icon="@drawable/ic_launcher"

       android:label="@string/app_name" >

       <activity

           android:name=".DemoActivity"

           android:label="@string/app_name" >

            <intent-filter>

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

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

            </intent-filter>

       </activity>

       <activity

            android:name=".Demo2Activity"//配置类名

            android:label="我是第二个activity" > //指定标题

            <intent-filter>//意图过滤器

                <actionandroid:name="cn.itcast.mutileactivity.haha" />

                <dataandroid:scheme="itcast"

  android:host="cn.itcast" android:path="/gaga"

                       android:mimeType="audio/mpeg"/>

                 

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

            </intent-filter>

           

             <intent-filter>

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

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

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

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

                <dataandroid:scheme="sms" />

                <dataandroid:scheme="smsto" />

            </intent-filter>

        </activity>

 

   </application>

3、指定布局文件:创建res/layout/main2.xml布局文件:

 

 

二、在第一个页面上点击一个按钮跳到第二个页面:

 

激活组件使用系统提供的Intent类。

 

三、显示意图:

显示意图 需要知道要激活组件的类名。

显示意图一般用在同一个应用程序中组件的相互激活。

//第一个页面的activity类:

public class DemoActivity extendsActivity {

   /** Called when the activity is first created. */

   @Override

   public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

       

   }

   //点击按钮 跳到第二个页面的方法:

   public void click(View view){

    // Intent 的作用就是激活组件.

   

    // 显示意图 一般用在同一个应用程序中 组件的相互激活

   显示意图的多种写法:

    ①//Intentintent = new Intent(this,Demo2Activity.class);

    Intent intent = new Intent();

    ②//intent.setClass(this,Demo2Activity.class);

    ③//intent.setClassName("cn.itcast.mutileactivity",

"cn.itcast.mutileactivity.Demo2Activity");

    ④//intent.setClassName(this,

  "cn.itcast.mutileactivity.Demo2Activity");

    ⑤//intent.setComponent(newComponentName(this,

 "cn.itcast.mutileactivity.Demo2Activity"));

    //激活意图:

    startActivity(intent);

}

 

四、隐式意图:

   隐式意图主要用在不同程序中的组件间的激活。如拨打电话的意图.

隐式意图:操作系统要根据action data mimetype category 进行一个查询, 所以隐式意图的效率要比现实意图的效率低一点 。

每个activity系统都会默认指定category android.intent.category.DEFAULT

 

1、 在AndroidManifest.xml清单文件中:指定一个意图过滤器:

<activity

     android:name=".Demo2Activity" //配置类名

     android:label="我是第二个activity" > //指定标题

     <intent-filter>//意图过滤器

//当前意图对应的动作,name的可随意给

         <actionandroid:name="cn.itcast.mutileactivity.haha" />

//为意图配置数据,当意图的action相同时,根据data数据区分具体的业务。

         <dataandroid:scheme="itcast" //itcast为数据的命名空间。

             android:host="cn.itcast"  //主机名

android:path="/gaga"       //路径

             android:mimeType="audio/mpeg"/> //数据类型

          //category元素,配置系统给定的意图。      

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

    </intent-filter>

</activity>

 

注意:①、一个activity可以配置多个意图过滤器:

②、在定义的意图过滤器中,要根据业务需求指定category元素的属性对应意图和当前意图对应的动作,

 

 

 

2、 隐式意图:页面跳转的点击事件:

 //隐式的意图

   public void click2(View view){

    //用于不同应用程序之间组件的激活

    // 操作系统要根据action data mimetype category 进行一个查询

    // 隐式意图的效率要比现实意图的效率低一点

     Intentintent = new Intent();

//设置动作:将在清单文件指定好的动作设置进来

    intent.setAction("cn.itcast.mutileactivity.haha");

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

 

使用设置数据和类型的方法,itcast://cn.itcast/gaga为:命名空间://主机名/路径 .都是在清单文件中配置的。

    intent.setDataAndType(Uri.parse("itcast://cn.itcast/gaga"),"audio/mpeg");

//添加组件的category

    intent.addCategory("android.intent.category.DEFAULT");

    startActivity(intent);

   

注意://设置数据类型

   intent.setType("audio/mpeg");

//设置数据

intent.setData(Uri.parse("itcast://cn.itcast/gaga"));*/

上面两个方法是互斥的,在设置数据和类型时,要使用setDataAndType()方法设置才可以。

 

例: 激活打电话意图的方法:

 public void click3(View view){

    Intent intent = new Intent();

    intent.setAction("android.intent.action.CALL");

    intent.setData(Uri.parse("tel:12345"));

    startActivity(intent);

  }

例:激活发短信意图的方法:

 public void click4(View view){

    Intent intent = new Intent();

    intent.setAction("android.intent.action.VIEW");

    intent.addCategory("android.intent.category.BROWSABLE");

    intent.setData(Uri.parse("sms:5556"));

    intent.putExtra("sms_body","nihao haha");

    startActivity(intent);

   }

 

五、在多个activity之间传递数据:

业务需求:将第一个页面中的输入的数据,在第二个页面中显示:

1、第一个页面的activity类

public class DemoActivity extendsActivity {

    privateEditText editText1;

   @Override

   public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

      //获取文本框组件

       editText1 = (EditText) this.findViewById(R.id.editText1);

   }

   

   //点击按钮的事件方法,激活第二个组件。

publicvoid click(View view){

//获取文本组件的值:

    String name =editText1.getText().toString().trim();

    //激活第二个意图

    Intent intent = newIntent(this,HelloActivty.class);

   //在意图中设置传递的值,就是传递的数据。

    intent.putExtra("name",name);

 

    //批量数据传递 ,使用Bundle 对象,相当于map集合。

    Bundle extras = new Bundle();

    extras.putString("name",name);

    intent.putExtras(extras);

   

    startActivity(intent);

   }

}

 

2、第二个页面的activity类:

public class HelloActivty extendsActivity {

   public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

    

       // 获取激活我的意图:获取激活本组件的意图:

       Intent intent = getIntent();

       //根据key获取在意图中的数据

       String name = intent.getStringExtra("name");

       //获取批量的数据

       Bundle extras = intent.getExtras(); //获取bundle对象。

       String name = extras.getString("name");

      //创建组件:

       TextView tv = new TextView(this);

       tv.setText("你好:"+name);

       setContentView(tv);

   }

}

六、关闭一个activity并获取这个activity的返回值:

1、业务需求:该activity中是联系人名称的列表,当选中一个联系人时,关闭当前的activity,返回选中联系人的姓名。在另外一个activity中获取关闭的activity的返回值。

 

2、//要被关闭的activity:

public class ContactListActivity extendsActivity {

    private  ListView lv;

   @Override

   public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.contact_list);

       lv = (ListView) this.findViewById(R.id.lv);

    Uri uri =Uri.parse("content://com.android.contacts/raw_contacts");

        Cursor cursor = this.getContentResolver().query(

uri,null, null, null, null);

        final List<String> names = newArrayList<String>();

        while (cursor.moveToNext()) {

           

        String id = cursor.getString(cursor.getColumnIndex("_id"));

        String name =

    cursor.getString(cursor.getColumnIndex("display_name"));

            //System.out.println(id);

            System.out.println("姓名"+ name);

            //System.out.println("--");

            names.add(name);

 

        }

        cursor.close();

       //为listView设置适配器:

        lv.setAdapter(newArrayAdapter<String>(this, R.layout.item, R.id.tv, names));

        //设置listView的点击事件:

        lv.setOnItemClickListener(newOnItemClickListener() {

 

            @Override

            publicvoid onItemClick(AdapterView<?> parent, View view,

                    intposition, long id) {

                //获取点击列表的联系人名称

                String name = names.get(position);

                //设置当前activity被关闭的时候的结果数据

                Intent data = new Intent();

                data.putExtra("name", name);

                  //设置当前activity结果集的方法

                   方法参数:(结果码,返回的数据)

                setResult(position, data);

                //关闭当前的activity

                ContactListActivity.this.finish();

            }

        });

   }

}

3、//接收关闭的activity返回值的activity:

public class DemoActivity extendsActivity {

    privateEditText editText1,editText2;

   /** Called when the activity is first created. */

   @Override

   public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

       editText1 = (EditText) this.findViewById(R.id.editText1);

       editText2 = (EditText) this.findViewById(R.id.editText2);

   }

   //点击按钮开启联系人列表视图

   public void click(View view){

    Intent intent = new Intent(this,ContactListActivity.class);

    //启动activity并可以获取返回值的方法。

方法参数(视图,请求码)

    startActivityForResult(intent,1);

   }

   public void click2(View view){

    Intent intent = newIntent(this,ContactListActivity.class);

    //startActivity(intent);

   

    startActivityForResult(intent, 2);

   }

   

//当新激活的界面销毁,重新回到这个界面,会执行此方法,

该方法参数:

    第一个参数:请求码,对应上面startActivityForResult方法中设置的请求码,用于区分是哪

                 个事件的操作。

     第二个参数:结果码,获取销毁页面中setResult()方法中设置的结果码。

  第三参数:销毁界面的返回值.

   protected void onActivityResult(int requestCode, int resultCode, Intentdata) {

    if(data!=null){

       

    Toast.makeText(this, "点击了第"+resultCode+"个条目", 0).show();  

     String name =  data.getStringExtra("name");

     

     if(requestCode==1)

     editText1.setText(name);

     if(requestCode==2)

         editText2.setText(name);

    }

   

   

    super.onActivityResult(requestCode,resultCode, data);

   }

   

}

七、activity的生命周期:

  1、activity生命周期中依次执行的方法:

  onCreate :activity被创建时调用的方法

  onStart  :界面可见的时候调用

  onResume  :当界面获取焦点时调用

  onPause  :当界面失去焦点时调用

  onStop  :当用户看不到界面时调用。

  onDestory:activity被销毁时调用的方法.

 

当内存不足或结束结束进程时,会调用onDestory方法销毁activity。

当一个界面创建出来后执行了onStop方法了,当再次被显示出来时,先调用onRestart方法,然后是onStart、onResume 方法。

2、生命周期的应用场景:

当在播放视频时来电,在onStop方法中暂停视频 ,在电话打完,在onStart方法中将暂停的视频重新播放。

 

 

八、activity横竖屏切换的生命周期:

在默认的情况下,横竖屏切换会先销毁activity再创建activity;

为了在切换横竖屏时,不销毁activity要在清单文件配置:

 android:configChanges="keyboardHidden|orientation"

 

 <activity

           android:name=".LifecycleActivity"

           android:configChanges="keyboardHidden|orientation"

           android:label="@string/app_name" >

            <intent-filter>

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

 

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

            </intent-filter>

 </activity>

当横竖屏切换时会执行activity类中的onConfigurationChanged()方法:

//横竖屏切换的activity类:

public class LifecycleActivity extendsActivity {

 @Override

    public voidonConfigurationChanged(Configuration newConfig) {

    //TODO Auto-generated method stub

    super.onConfigurationChanged(newConfig);

    System.out.println("configchange");

    }

}

九、指定新创建的activity是一个对话框的形式:

在清单文件中指定:activity的样式:

 <activityandroid:name=".Activity02"

           android:theme="@android:style/Theme.Dialog" //对话框样式。

          ></activity>

 

十、activity的启动模式 和 task任务栈、:

1、task任务栈:

Task (任务栈):一组任务的集合。  使用任务栈管理activity(任务),

 Task任务栈主要用来存放已经打开的activity的引用,最近打开的activity处于任务栈的栈顶,栈顶的activity是用户可见的activity。

通过任务栈系统可以管理应用程序的行为(管理应用程序如何打开,如何退出).

 

在activity类中 通过getTaskId()获取任务栈的id。

 

 

 

2、Activity的启动模式:

①、Standard:默认模式。 

②、singleTop:如果task栈栈顶是activityB,再去开启activityB,就不会创建新的activityB的实例。

当复用栈顶的组件时会调用activityB类中中的onNewIntent()方法.

            

  例:浏览器添加书签的应用。

③、singleTask:当开启新的activity的时候,首先判断任务栈里面是否存在要激活的activity,如果存在的话,就直接把这个已经存在的activity在任务栈中上面的其他activity都给清除掉,然后复用这个已经存在的activity。

应用场景:创建浏览器的BrowserActivity实例使用该模式。

④、singleInstance模式:首先开启一个activityA在任务栈A中,再开启一个新的activityB,此时就会创建一个新的任务栈B,用于存放activityB,在任务栈A的栈顶保留了对activityB的引用。

 

 

 

任务栈模型:

0 0
原创粉丝点击