Android 四大组件 @activity

1、创建第二个activity
1. 创建class类继承Activity
2. 创建布局文件,作为Activity的显示内容
3. 在清单文件中注册Activity
继承一个activity;
配置清单文件;新创建的activity,必须在清单文件中做配置,否则系统找不到,在显示时会直接报错

<activity android:name="com.zh.second.SecondActivity"></activity>

要显示activity需要在清单文件中加入意图过滤器入口。就会生成快捷图标。

  <activity android:name="com.zh.second.SecondActivity">
            <intent-filter >
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>

            </intent-filter>
        </activity>

清单文件配置时需要注意的是:
activity中没有设置标签label的话与application中的label是一样的。lable标签显示的是图标的名字。也就是应用在屏幕上显示的结果。
icon 显示的是应用的图标,activity不设置图标默认显示的是appliaction 的图标。

 <activity
            android:icon="@drawable/photo1"   //app应用显示的是photo1的图标。  
            android:name=".MainActivity"    
            android:label="主页面" >   // 定义的label
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

这样在清单文件中,设置可以达到一个引用两个界面的效果(当然两个界面显示不一样的话定义两个layout布局文件)
继承activity后注意配置清单文件中的activity.

   <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:icon="@drawable/photo1"
            android:name=".MainActivity"
            android:label="主页面" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:icon="@drawable/photo2"
            android:name="com.zh.second.SecondActivity"
            android:label="第二个页面" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

在实际当中最常用到的是一个 app中一个activity跳转到另一个activity。
08-06 07:52:48.260: I/ActivityManager(1558): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.dialer/.DialtactsActivity} from pid 1688

包名和类名。
在activity中跳转可以分为显式跳转和隐式跳转:
显式跳转: 需要指定包名和类名。 对于在同一个MainActivity的可以只指定类名。
Intent intent = new Intent();
intent.setClass(this,SecondActivity.class);
startActivity(intent);
另一种是指定包名和类名。 setClassName(packagename, 包名+类名) ;
隐式跳转:
隐式跳转需要 设置action和data 就是与要跳转到的activity 里面的action等匹配。
隐式跳转到的activity中要定义intent—filter 意图过滤器的action和category(附加物缺一不可)
要跳转到的目标activity中需要定义的清单文件:

<activity android:name="com.zh.jump.SecondActivity" >
            <intent-filter>
                <action android:name="com.zh.second" />    //这里的action的名字可以随意写。 

                <category android:name="android.intent.category.DEFAULT" />  //跳转的目标处清单文件必须定义                               
            </intent-filter>                                    category (种类,附加)
        </activity>

若不加category节点,会出现 Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.zh.second } Activity找不到异常。

隐式跳转端的:

public void click5(View v){
        Intent intent = new Intent();
        intent.setAction("com.zh.second");
    //intent.addCategory(intent.CATEGORY_DEFAULT);  //可以省略不写系统会默认添加的。因为这里是default的  其他情况需要加上。
        startActivity(intent);
    }

这里面startActivity(intent),调用时系统会在整个安卓文件清单中查询是否有与action匹配的节点。
隐式跳转的原理:就是设置的action,data,category要与清单文件中的配置相同。
demo1:
隐式跳转到拨号器:

public void click4(View v){
        Intent  intent = new Intent();
        intent.setAction(Intent.ACTION_DIAL);
        startActivity(intent);

    }

demo2:隐式跳转到拨打电话:


    public void click1(View v) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_CALL);  //设置的action
        intent.setData(Uri.parse("tel:110"));
        //跳转到指定的activity.
        startActivity(intent);


    }

隐式跳转需要匹配清单文件中的intent—filter中的三个节点 必须匹配:
action 、category、data。
当intent-filter中有多种action或data等只需要一种匹配一样就可以。但是种类必须匹配全。
data节点中常用的有 scheme ( 作为setdata(uri.parse(“”))的前缀)
mime 设计的初衷是 类型/作用

  <data android:mimeType="Text/password" android:scheme="zm"/>

设置时需要注意:
intent.setDataAndType(Uri.parse(“zm:11”), “Text/password”);
单一设置一种或者两个都会出现被清除的情况。只能用上面的方法。


隐式启动中重要的一点是 一个activity跳转到另一个activity数据的携带。从这个携带目标activity。
目标activity的接收数据:
//获得启动该activity的意图。
Intent intent = getIntent();
intent.getData(uri.toString());//获得传递的数据。
》<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
隐式跳转和显式跳转的应用场景:
显式意图:启动同一应用下的activity中用显式意图。
隐式意图:启动不同应用下的activity中用隐式意图。
在启动效率上,隐式远远低于显式。
如果系统中有多个Activity与意图设置的Action匹配,那么在启动Activity时,会弹出一个对话框,里面包含所有匹配的Activity。 (言外之意就是只能用隐式启动才能达到这种效果)


隐式跳转时数据通过data节点可以传递数据。
显式跳转时数据的传输;显式跳转一般是同一应用下的activity的跳转。
显式跳转数的传递分为两种:
存放在intent的对象中:
第二种:先将数据封装在Bundle对象中,然后再将Bundle对象封装在Intent对象中。

数据的封装:

package com.zh.senddata;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
    public void click (View v){
        EditText  et_female = (EditText) findViewById(R.id.female);
        EditText  et_male =(EditText) findViewById(R.id.male);
        String  et_femalename= et_female.getText().toString();
        String  et_malename= et_male.getText().toString();

        Intent intent = new Intent(this, SecondActivity.class);     //第一步就是创建Intent对象,进行显式调转,明确要跳转的类名。
        //把数据封装在intent对象中。
//      intent.putExtra("female", et_femalename);
//      intent.putExtra("male", et_malename);
        //把数据封装到bundle对象中。
        Bundle  bundle = new Bundle();
        bundle.putString("female", et_femalename);
        bundle.putString("male", et_malename);
        //把Bundle对象封装到intent对象中。
         intent.putExtras(bundle);

        startActivity(intent);        //开始跳转到指定的activity.

    }
}

数据的取出:demo

package com.zh.senddata;

import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends Activity {
              @Override
            protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_second);
                Intent intent= getIntent();  //该方法调用会返回启用该activity的意图对象。
//              String  femalename= intent.getStringExtra("female");
//              String  malename = intent.getStringExtra("male");

              Bundle  bundle =  intent.getExtras();
              String femalename=   bundle.getString("female");
              String  malename = bundle.getString("male");

                Random   rd = new Random();
                int yinyuan  =   rd.nextInt(110);
                if("zhangsan".equals(malename)&&"芙蓉姐姐".equals(femalename)){
                       yinyuan = 110;
                }

                TextView  tv = (TextView) findViewById(R.id.tv);
                tv.setText(malename+"和"+femalename+"的姻缘值"+yinyuan);

            }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值