Activity详解

新建一个Activity会生成一下内容:

其中里面的setConentView(), 是给Activity加载一个布局,里面传入的是一个布局文件的id。

新建一个Activity时默认会自动在AndroidManifest文件中自动注册,如果没有自动注册的话,我们就需要自动手动去注册,不注册,将导致程序运行出现异常,下面看一下注册内容:

这个是主Activity的注册信息,加上了

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
表示当前Activity是主Activity,点击应用图标,就会启动这个Activity。

1.标题栏的隐藏:

  在setContentView()的前面加上一句requestWindowFeature(Window.FEATURE_NO_TITLE);

2.Activity中使用menu:

  以代码的方式添加menu:

  

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(Menu.NONE,1,0,"开始");
        menu.add(Menu.NONE,2,1,"结束");
        return true;
    }
  add(int groupId, int itemId, int order, CharSequence title)

    groupId:表示组别,如果部分在就写Menu.NONE;

    itemId:用来确定不同的菜单,区别item;

    order:item的排放的先后顺序;

    title:item显示的文字内容;

  

    布局方式添加Menu:

    新建Menu资源文件夹:res-->New-->Android resource directory:

    

   确认之后,在res/menu/新建 Menu resource file :

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/first"
        android:title="first"
        />

    <item android:id="@+id/second"
        android:title="second"/>
</menu>
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_item,menu);
        return true;
    }
}

   最后显示:

  

  后面会写再写博客详细介绍Menu

3.Activity的销毁:

  除了按下Back键可以销毁一个Activity之外,还可以调用finish()方法,直接销毁。

4.Intent:

  1)显示Intent的使用:

    AActivity调往BActivity:

    Intent intent = new Intent(AActivity.this,BActivity.class);

    startActivity(intent);

  

5.Intent返回数据给上一个Activity:

  startActivityForResult(intent,1);    ---FirstActivity

  setResult(RESULT_OK,intent);      ----secondActivity 

  onActivtiyResult(int requestCode, int resultCode, intent data);           ---FirstActivity 

  

  第一个Activity

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(this);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case 1:
                if (resultCode == RESULT_OK){
                    tv.setText(data.getStringExtra("data"));
                }
        }
    }

  第二个Activity:

 

@Override
    public void onBackPressed() {
        Intent intent = new Intent();
        intent.putExtra("data","hello MainActivity");
        setResult(RESULT_OK,intent);
        super.onBackPressed();
    }

  切记第二个Activity中的setResult的内容下载supr的前面。

6、Activity的各种生命周期

  1)Activity创建时:onCreate()-->onStart()-->onResume()

  2) 按下HOME键:onPause()-->onStop();

  3) 再重新回到Activity:onRestart()-->onStart()-->onResume();

  4) 按下Back键: onPause()-->onStop()-->onDestory();

  

  5) 按下Back键返回上一个Activity时:(B)onPause()-->(A)onRestart()-->(A)onStart()-->(A)onResume()-->(B)onStop()-->(B)onDestory();

  6) A跳转到B时: (A)onPause()-->(B)onCreate()-->(B)onStart()-->(B)onResume()-->(如果B不是透明的,A就不执行onStop()方法);

    当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变

7、Activity的回收与数据恢复:

  在默认的Activity启动模式下,Activity会不断创建和被回收,可能会导致数据的丢失,所以Activity提供了回调方法onSaveInstanceState(),这个方法会携带一个Bundle参数,把你想要保存的值放在Bundle中,然后在onCreate()方法中也有Bundle参数,用来取出数据。

8、Activity的四种启动模式:

  standard、singleTop、singleTask、singleInstance

  1) standard :每启动一个新的Activity,都会在返回栈中入栈,并处于栈顶的位置;

  2) singleTop:在启动Activity时,如果返回发现返回栈的栈顶已经是该Activity,则直接使用当前Activity,不会创建新的Activity;

  3) singleTask:每次启动Activity的时候,系统首先会在返回栈中检查是否存在该Activity,如果已经存在,则直接使用该实例,把这个Activity之上的所有Activity全部出栈,如果没有发现,会创建一个新的实例。

  4) singleInstance:活动会启动一个新的返回栈来管理这个Activity;应用场景:当想把一个Activity给自己的应用和其他应用使用的时候;

9、随时退出程序:

  

public class ActivityCollector {
    /** Activity的集合 */
    public static List<Activity> activities = new ArrayList<>();

    /**
     * 添加Activity到集合,写在Activity的onCreate()方法里
     * @param activity  要添加的Activity
     */
    public static void addActivity(Activity activity){
        activities.add(activity);
    }

    /**
     * 移除指定的Activity
     * @param activity 要移除的Activity
     */
    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }

    /**
     * 销毁集合中所有的Activity
     */
    public static void finishAll(){
        for (Activity activity:activities){
            if (!activity.isFinishing()){
                activity.finish();
            }
        }
    }
}

  

  

  

GitHub:https://github.com/godfunc
博客园:http://www.cnblogs.com/godfunc
Copyright ©2019 Godfunc
原文地址:https://www.cnblogs.com/Godfunc/p/6519572.html