当前位置:   article > 正文

第四章-Android程序活动单元Activity_12、如何创建、配置、开启和关闭activity?

12、如何创建、配置、开启和关闭activity?

1.Activity生命周期

启动状态 运行状态 暂停状态 停止状态 销毁状态

生命周期方法

onCreate()Activity创建时调用
onStart()Activity即将可见时调用
onResume()Activity获取焦点时调用
onPause()Activity被其他Activity覆盖或屏幕锁屏时调用
onStop()Activity对用户不可见时调用
onDestroyActivity销毁时调用
onRestart()Activity从停止到启动时调用

2.Activity的创建、配置、开启和关闭

1.创建-----一个Activity对应一个xml布局文件

image.png

2.配置

创建的每一个Activity都必须在清单文件中配置才生效

    	<activity
            android:name=".MyActivity"
            android:exported="false" />
  • 1
  • 2
  • 3

3.开启和关闭Activity

(1)在MainActivity中添加按钮单击事件,让其跳转到MyActivity页面
(2)在MyActivity中添加按钮单击事件,关闭当前页面

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("MainActivity","调用onCreate方法");

        Button btn = findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //创建Intent对象   跳转到MyActivity页面
                Intent intent = new Intent(MainActivity.this,MyActivity.class);
                startActivity(intent);
            }
        });
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
public class MyActivity extends AppCompatActivity {

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

        Button btn1 = findViewById(R.id.btn_1);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //关闭当前页面
                finish();
            }
        });
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3.Intent和IntentFilter

使用 Intent 从一个Activity切换到另一个Activity

1.Intent

不仅可以指定当前组件执行的动作,还可以在不同组件之间数据传递

(1)显式Intent

直接指定目标组件

Intent intent = new Intent(A.this, B.class);
    startActivity(intent);
  • 1
  • 2
(2)隐式Intent

action用来指定Intent对象的动作
在清单文件中为Activity添加 时,必须添加action属性。否则隐式Intent无法开启

        <activity
            android:name=".C"
            android:exported="false">
            <intent-filter>
<!--                name 不能与 Activity 重名-->
                <action android:name="d" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
            	Intent intent1 = new Intent();
                intent1.setAction("d");
                startActivity(intent1);
  • 1
  • 2
  • 3

2.IntentFilter

当发送一个隐式Intent后,Android系统会将它与程序中每一个组件的过滤器进行匹配,匹配属性有action、data、category,需要三个属性都匹配成功才能唤起相应组件。

  1. action属性匹配规则
    action属性用来指定Intent对象的动作
  2. data属性匹配规则
    data属性用来指定数据的URI或者数据MIME类型,它的值通常与Intent的action属性有关联。
  3. category属性匹配规则
    category属性用于为action添加额外信息,一个interFilter可以不声明category属性,也可以声明多个category属性。
<intent-filter>      
  <action android:name="android.intent.action.EDIT"/>      
  ······  
<intent-filter> 
  • 1
  • 2
  • 3
  • 4

标签中间可以罗列多个action属性,但是当使用隐式Intent激活组件时,只要Intent携带的action与其中一个标签中action的声明相同,action属性就匹配成功。
在清单文件中为Activity添加标签时,必须添加action属性,否则隐式Intent无法开启该Activity。

<intent-filter>     
  <data android:mimeType="Video/mpeg" android:scheme="http..."/>    
  ··· 
</intent-filter> 
  • 1
  • 2
  • 3
  • 4

标签中间可以罗列多个data属性,每个data属性可以指定数据的MIME类型和URI。其中MIME类型可以表示image/ipeg、video/*等媒体类型。
隐式Intent携带的data与其中一个标签中data的声明相同,data属性就匹配成功。

<intent-filter>     
  <category android:name="android.intent.category.DEFAULT"/>    
  ······ 
</intent-filter> 
  • 1
  • 2
  • 3
  • 4

隐式Intent中声明的category必须全部能够与某一个IntentFilter中的category匹配才算匹配成功。IntentFilter中罗列的category属性数量必须大于或者等于隐式Intent携带的category属性数量时,category属性才能匹配成功。如果一个隐式Intent没有设置category属性,那么它可以通过任何一个IntentFilter的category匹配。

4.Activity之间的跳转

1.putExtra()

通过putExtra()方法将传递的数据储存在Intent对象中

Intent intent = new Intent(MainActivity.this, FirstActivity.class);
                intent.putExtra("name","王小明");
                intent.putExtra("age",12);
                intent.putExtra("isPassed",true);
                startActivity(intent);
  • 1
  • 2
  • 3
  • 4
  • 5

接收

//        接收数据并将数据显示在text1
        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age", 0);
        boolean isPassed = intent.getBooleanExtra("isPassed", true);
        text1.setText(name + ":" + age + ":" + isPassed);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.Bundle

使用Bundle传递数据

Intent intent1 = new Intent(MainActivity.this, SecondActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString("name","王小明");
                bundle.putInt("age",12);
                intent1.putExtras(bundle);
                startActivity(intent1);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

接收

//        接收数据并显示在text2
        Bundle bundle = getIntent().getExtras();
        String name = bundle.getString("name");
        int age = bundle.getInt("age");
        text2.setText(name + ":" + age);
  • 1
  • 2
  • 3
  • 4
  • 5

3.Activity之间的数据回传

1.startActivityForResult()

用于开启一个Activity,当开启的Activity销毁时,希望从中返回数据。
requestCode表示请求码,用于标识请求来源。

2.setResult()

resultCode表示返回码,用于标识返回的数据来自哪个Activity。
intent用于携带数据并回传到上个界面。

3.onActivityResult()

用于接收回传的数据,并根据传递的参数requestCode、resultCode来识别数据来源

public class MainActivity extends AppCompatActivity {
    Button btn1;
    TextView text;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && resultCode == 2){
            String name = data.getStringExtra("name");
            int age = data.getIntExtra("age", 0);
            text.setText(name + ":" + age);
        }
    }

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

        text = findViewById(R.id.text);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                启动SecondActivity,并且希望其回传数据
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivityForResult(intent,1);
            }
        });
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
//                回传数据----将数据传回MainActivity
                Intent intent = new Intent();
                intent.putExtra("name", "王小明");
                intent.putExtra("age", 12);
                setResult(2, intent);
                finish();

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.6 使用Fragment(碎片)

4.6.1 Fragment简介

Fragment是一种嵌入在Activity中的UI片段,它可以用来描述Activity中的一部分布局。
一个Activity可以包含多个Fragment,一个Fragment也可以在多个Activity中使用。

4.6.2 Fragment的生命周期

当在Activity中创建Fragment时,Fragment处于启动状态,
当Activity被暂停时,其中的所有Fragment也被暂停,
当Activity被销毁时,其中的所有Fragment也被销毁,
当一个Activity处于运行状态时,可以单独地对每一个Fragment进行操作:添加时Fragment处于启动状态,删除时Fragment处于销毁状态。
Fragment生命周期相比Activity额外方法:

  • onAttach():Fragment和Activity建立关联时调用
  • onCreateView():Fragment创建视图(加载布局)时创建
  • onActivityCreate():Fragment相关联的Activity已经创建时调用
  • onDestroyView(): Fragment关联的视图被移除时调用
  • onDetach(): Fragment和Activity解除关联时调用
  • image.png

4.6.3 创建Fragment

创建Fragment时必须创建一个类继承自Fragement。

public class NewListFragment extends Fragment{
    @Override     
    public View on CreareView(LayoutInflater, inflater, ViewGroup container, Bundle savedInstanceState){
        View v = inflater.inflate(R.layout.fragment,container, false);         
        return v;     
    } 
} 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.6.4 在Activity中添加Fragment

Fragment创建完成后并不能单独使用,还需要将Fragment添加到Activity中。

  1. 在布局文件中添加Fragment
    需要在Activity引用的布局文件中使用标签,必须指定android:name属性,属性值为Fragment的全路径名称。
  2. 在Activity中动态加载Fragment
    1. 创建一个Fragment实例
    2. 获取FragmentManager的实例
    3. 开启FragmentTransaction
    4. 向Activity的布局容器中添加Fragment
    5. 通过commit()提交事务
<fragment
  android:name="cn.itcast.NewsListFragment"
  android:id="@+id/newslist"
  android:layout_width="match_parent"
  android:layout_height="match_parent"/> 
  • 1
  • 2
  • 3
  • 4
  • 5
public class MainActivity extends Activity{
    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_main);
        NewsListFragment fragment = new NewsListFragment();
        FragmentManage fm = getFragementManager();
        FragmentTransaction beginTransaction = fm.beginTransaction();
        beginTransaction.replace(R.id.ll,fragment);
        beginTransaction.commit(); 
    } 
} 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

“getFragmentManager和android.app.Fragment在API 28中已弃用。
现在,我们应该分别使用支持库中的Fragment和getSupportFragmentManager。
但是,如果您担心这些弃用,则还应注意,API 28也弃用了PreferenceFragments。
相反,您应该使用PreferenceFragmentCompat”
应将getFragementManager替换为getSupportFragmentManager()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/178031
推荐阅读
相关标签
  

闽ICP备14008679号