《》Activity的配置

所谓的Activity的配置,在Manifest.xml文件中对文件中定义的Activity类进行一下声明:

<activity 

    android:name=".SampleActivity"

    android:icon="@drawable/pic.png"

    android:label="@string/briefdescribe"

   android:exported="true"

   android:launchMode="singleInstance">

</activity>

其中:

name:指定该Activity的实现类的类名
icon:指定该Activity的标题栏中使用的图标

label:指定该Activity的标题栏中使用的描述文字

exported:指定该Activity是否能够被其他的应用调用

launchMode:指定当前Activity的加载模式(已经讲过了,可查阅)

此外配置Activity还有对Intent的配置(这一部分在将Intent的时候在讲解),

有对Activity的属性设置的总结

下面举几个:

android:alwaysRetainTaskState
是否保留状态不变, 比如切换回home, 再从新打开, activity处于最后的状态

android:clearTaskOnLanunch
比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 从新启动 P, 是否显示 Q

 

android:finishOnTaskLaunch
是否关闭已打开的activity当用户重新启动这个任务的时候

android:permission

《》Activity显示时的屏幕设置

1、锁定屏幕方向:横屏/ 竖屏

Android 内置了方向感应器的支持。Android 会根据所处的方向自动在竖屏和横屏间切换。但是有时我们的应用程序仅能在横屏/ 竖屏时运行,比如某些游戏,此时我们需要锁定该Activity 运行时的屏幕方向,<activity>节点的android:screenOrientation属性可以完成该项任务,示例代码如下:

【方法一】在清单文件中配置:

<activity android:name=".EX01"
    android:label="@string/app_name"
    android:screenOrientation="portrait"> 
    // 值为portrait时强制为竖屏, 值为landscape时强制为横屏
</activity>

【方法二】通过代码实现(一般放在onCreate方法中的前面),如下:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATTION_LANDSCAPE); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATTION_PORTRAIT);

这里提一个小知识,Android模拟器中,快捷键"Ctrl+F11/F12"可以实现转屏

2、全屏显示:

可以在其onCreate()方法中添加如下代码实现:

//设置全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//去除标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);

 

3、以对话框形式显示Activity:

在清单文件中配置:

<activity 
    android:name="com.example.smyh004activity02.SecondActivity"
    android:label="SecondActivity"
    android:theme="@android:style/Theme.DeviceDefault.Dialog">            
</activity>

 

《》启动和关闭Activity

调用startActivity(Intent intent):启动其他的Activity实例

调用finish():结束当前的Activity实例

下面举一个实例:

StartActivity的布局文件中只有一个按钮,当点击时,就会打开SecondActivity

public class StartActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_start);
        
        Button bn = (Button)findViewById(R.id.button);
        bn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(StartActivity.this, SecondActivity.class) ;
                //或者是Intent intent = new Intent() ;
                // intent.setClass(StartActivity.this, SecondActivity.class) ;
                startActivity(intent) ;
            }
        });
    }

SecondActvity的布局文件中有两个按钮,一个是用来启动StartActivity的,另一个按钮是启动StartActivity的同时将SecondeActivity关闭

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Button previous = (Button)findViewById(R.id.button1);
        Button close = (Button) findViewById(R.id.button2) ;
        final Intent intent = new Intent(SecondActivity.this,StartActivity.class);
        previous.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                startActivity(intent) ;
            }
        });
        close.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                startActivity(intent) ;
                finish();
            }
        });
    }
}

《》使用Intent和Bundle在Activity之间传递数据

1、前面已经介绍过,Bundle是一个相当于Map的类,我们可以用这个类的实例来装载一些数据显而易见,之后我们可以将Bundle封装在Intent中,通过Intent 在启动另一个Activity的同时,将数据传送给它;在Intent的成员方法中有很多方法 用来封装数据:

putExtras(Bundle data):向Intent中放入需要“携带的数据包”

Bundle getExtras():取出Intent中所携带的数据包

putExtra(String name , XXX value) : 直接向Intent中按key_value的方式存入数据

getXXXExtra(String name ):将数据取出

注意:后面的两种方法表面上是将数据直接存放进了Intent中了,但是实际上,Intent会自动的隐含的创建一个Bundle对象之后,在将数据存进Bundle,所以通过直接的方式存入数据,我们照样可以调用Intent的getExtras来获得其中的Bundle对象的

前面已经介绍过用Bundle可以将基本的数据类型的数据封装进去,而且也能够将对象封装进去(只要是对象可序列化即可,这非常的简单,查看前面的笔记);

2、这样一来我们就能够通过使用startActivity(Intent intent)启动另一个Activity的同时将数据传给这个Activity了

3、在启动的Activity中调用getIntent()方法就能够返回一个Intent 对象,这个Intent对象就是传过来的Intent对象,之后我们就能够调用Intent的get方法获得存在其中的数据

举例:

说明:在BundleActivity的布局文件中,我们做的是一个用户注册界面:有用户名输入框、密码输入框、性别RadioButton按钮、和一个提交按钮,当我们点击提交按钮的时候会打开另一个ResultActivity界面,同时将这些信心通过Bundle传给ResultActivity,这个界面布局文件中有几个TextView,用来显示BundleActivity传过来的Bundle数据

Person.java 文件,我们将BundleActivity界面中填好的信息用Person对象存储
public class Person implements Serializable
{
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    private Integer id;
    private String name;
    private String pass;
    private String gender;

    public Person()
    {
    }

    /**
     * @param name
     * @param pass
     * @param gender
     */
    public Person(String name, String pass, String gender)
    {
        this.name = name;
        this.pass = pass;
        this.gender = gender;
    }
    public Integer getId()
    {
        return id;
    }
    public void setId(Integer id)
    {
        this.id = id;
    }
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getPass()
    {
        return pass;
    }
    public void setPass(String pass)
    {
        this.pass = pass;
    }
    public String getGender()
    {
        return gender;
    }
    public void setGender(String gender)
    {
        this.gender = gender;
    }

}

BundleActivity.java文件

public class BundleTest extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button bn = (Button) findViewById(R.id.bn);
        bn.setOnClickListener(new OnClickListener()
        {
            public void onClick(View v)
            {
                EditText name = (EditText)findViewById(R.id.name);
                EditText passwd = (EditText)findViewById(R.id.passwd);
                RadioButton male = (RadioButton) findViewById(R.id.male);
                String gender = male.isChecked() ? "男 " : "女";
                Person p = new Person(name.getText().toString(), passwd
                        .getText().toString(), gender);
                // 创建一个Bundle对象
                Bundle data = new Bundle();
                data.putSerializable("person", p);
                // 创建一个Intent
                Intent intent = new Intent(BundleTest.this,
                        ResultActivity.class);
                intent.putExtras(data);
                // 启动intent对应的Activity
                startActivity(intent);
            }
        });
    }
}

ResultActivity.java 文件

public class ResultActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.result);
        TextView name = (TextView) findViewById(R.id.name);
        TextView passwd = (TextView) findViewById(R.id.passwd);
        TextView gender = (TextView) findViewById(R.id.gender);
        // 获取启动该Result的Intent
        Intent intent = getIntent();
        // 直接通过Intent取出它所携带的Bundle数据包中的数据
        Person p = (Person) intent.getSerializableExtra("person");
        name.setText("您的用户名为:" + p.getName());
        passwd.setText("您的密码为:" + p.getPass());
        gender.setText("您的性别为:" + p.getGender());
    }
}

 

 

》启动其他的Activity并返回结果

使用这种方法的步骤如下:

1、当前的Activity重写onActivityResult(int requestCode , int resultCode , Intent) ,当被启动的Activity返回结果的时候,该方法将会被触发,其中的requestCode 和resultCode都是根据业务自行设置的

2、当前的Activity通过调用starActivityForResult(Intent intent , int requestCode)启动新的Activity

3、被启动的新的Activity需要调用setResult(int resultCode , Intent intent )方法设置将要返回个旧Activity的结果,(将数据封装在Intent中 ),一但调用这个方法,就会回调  1 、中的onActivityResult(int requestCode , int resultCode , Intent)方法,其中参数Intent 和 resultCode 就是setResult(int resultCode , Intent intent )中的实参 , requestCode就是  2 、 中starActivityForResult(Intent intent , int requestCode)中的requestCode实参

举例:

这个例子非常的简单,在ActivityForResult的布局文件中只有一个按钮(“选择您所在的城市”)和一个文本框(用来显示选择的城市)

Android 配置kotlin android 配置activity_ide

当我们点击上面的按钮的时候,就会启动SelectCityActivity,这个Activity用一个列表显示待选的城市,当点击一个城市的时候,就会将结果返回给ActivityForResult

Android 配置kotlin android 配置activity_Android 配置kotlin_02

代码如下:

ActivityForResult.java 文件

public class ActivityForResult extends Activity
{
    Button bn;
    EditText city;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 获取界面上的组件
        bn = (Button) findViewById(R.id.bn);
        city = (EditText) findViewById(R.id.city);
        // 为按钮绑定事件监听器
        bn.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                // 创建需要对应于目标Activity的Intent
                Intent intent = new Intent(ActivityForResult.this,
                        SelectCityActivity.class);
                // 启动指定Activity并等待返回的结果,其中0是请求码,用于标识该请求
                startActivityForResult(intent, 0);
            }
        });
    }

    // 重写该方法,该方法以回调的方式来获取指定Activity返回的结果
    @Override
    public void onActivityResult(int requestCode
        , int resultCode, Intent intent)
    {
        
        // 当requestCode、resultCode同时为0,也就是处理特定的结果
        if (requestCode == 0 && resultCode == 0)
        {
            // 取出Intent里的Extras数据
            Bundle data = intent.getExtras();
            // 取出Bundle中的数据
            String resultCity = data.getString("city");
            // 修改city文本框的内容
            city.setText(resultCity);
            
        }
    }
}

 

SelectCityActivity.java 文件

public class SelectCityActivity extends ExpandableListActivity
{
    // 定义省份数组
    private String[] provinces = new String[]
    { "广东", "广西", "湖南"};
    private String[][] cities = new String[][]
    {
        { "广州", "深圳", "珠海", "中山" },
        { "桂林", "柳州", "南宁", "北海" },
        { "长沙", "岳阳" , "衡阳" , "株洲" }
    };

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        ExpandableListAdapter adapter = new BaseExpandableListAdapter()
        {
            // 获取指定组位置、指定子列表项处的子列表项数据
            @Override
            public Object getChild(int groupPosition, int childPosition)
            {
                return cities[groupPosition][childPosition];
            }

            @Override
            public long getChildId(int groupPosition, int childPosition)
            {
                return childPosition;
            }

            @Override
            public int getChildrenCount(int groupPosition)
            {
                return cities[groupPosition].length;
            }

            private TextView getTextView()
            {
                AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT, 64);
                TextView textView = new TextView(SelectCityActivity.this);
                textView.setLayoutParams(lp);
                textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
                textView.setPadding(36, 0, 0, 0);
                textView.setTextSize(20);
                return textView;
            }

            // 该方法决定每个子选项的外观
            @Override
            public View getChildView(int groupPosition, int childPosition,
                    boolean isLastChild, View convertView, ViewGroup parent)
            {
                TextView textView = getTextView();
                textView.setText(getChild(groupPosition, childPosition)
                        .toString());
                return textView;
            }

            // 获取指定组位置处的组数据
            @Override
            public Object getGroup(int groupPosition)
            {
                return provinces[groupPosition];
            }

            @Override
            public int getGroupCount()
            {
                return provinces.length;
            }

            @Override
            public long getGroupId(int groupPosition)
            {
                return groupPosition;
            }

            // 该方法决定每个组选项的外观
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded,
                    View convertView, ViewGroup parent)
            {
                LinearLayout ll = new LinearLayout(SelectCityActivity.this);
                ll.setOrientation(0);
                ImageView logo = new ImageView(SelectCityActivity.this);
                ll.addView(logo);
                TextView textView = getTextView();
                textView.setText(getGroup(groupPosition).toString());
                ll.addView(textView);
                return ll;
            }

            @Override
            public boolean isChildSelectable(int groupPosition,
                    int childPosition)
            {
                return true;
            }

            @Override
            public boolean hasStableIds()
            {
                return true;
            }
        };
        // 设置该窗口显示列表
        setListAdapter(adapter);
        getExpandableListView().setOnChildClickListener(
            new OnChildClickListener()
            {
                @Override
                public boolean onChildClick(ExpandableListView parent,
                        View source, int groupPosition, int childPosition,
                        long id)
                {
                    // 获取启动该Activity之前的Activity对应的Intent
                    Intent intent = getIntent();
                    intent.putExtra("city",
                            cities[groupPosition][childPosition]);
                    // 设置该SelectActivity的结果码,并设置结束之后退回的Activity
                    SelectCityActivity.this.setResult(0, intent);
                    // 结束SelectCityActivity。
                    SelectCityActivity.this.finish();
                    return false;
                }
            });
    }
}