activity配置

1.如何创建一个Activity?

     必须创建一个Activity的 子类,在子类中需要实现Activity状态在生命周期中切换时系统回调的函数(onCreate、onStart、onResume、onPause、onStop、onDestroy),当然并非所有的函数都需要重新实现。其中两个比较重要的函数为onCreate和onPause:

     onCreate(),此方法必须要重写。系统调用此方法创建activity,实现该方法是你初始化你所创建Activity的重要步骤。其中最重要的就是调用 setContentView() 去定义你的要展现的用户界面的布局。

     onPause(),当系统任务用户离开此界面时会调用此方法,此时并非销毁一个Activity。通常在这里就要处理一些持久超越用户会话的变化,比如:数据的保存。

      为了保证流畅的用户体验和处理,你可以调用其他的回调函数来使你的Atctivity停止或销毁。在onStop()方法中,一般做一些大资源货对象的释放,如:网络或者数据库连接。可以在onResume时再加载所需要资源。

2.创建Activity  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  class  MainActivity  extends  Activity { 
 
     //必须重写的方法 
 
     @Override 
 
     protected  void  onCreate(Bundle savedInstanceState) { 
 
         super .onCreate(savedInstanceState); 
 
         setContentView(R.layout.activity_main); //activity的布局 
 
    
 

 

 

       2.一个Activity创建完成后,为了它可以访问系统必须要声明注册它到应用的AndroidManifest.xml文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
     android:name= "com.zy.demo.activity.MainActivity" 
 
     android:label= "@string/app_name" 
 
      
 
         "android.intent.action.MAIN"  /> 
 
         "android.intent.category.LAUNCHER"  /> 
 
      
 
 

      有很多属性供开发者定义不同特色的Activity,比如lable、icon或者theme、style等。其中android:name是必须的属性,用来定义activity的名字,当应用发布后不能改变。

     还提供各种intent-filter,使用来声明其它应用组件如何激活(启动)Activity,有包含两个元素。如上例中

用来表示此Activity需要响应android.intent.action.MAIN(表明为应用程序的主要入口)

表示Activity为LAUNCHER类别,即应用程序会列在Launcher中,允许用户直接启动。

        以上也是一个应用的主activity所必须的声明方法:一个MAIN action,和一个LAUNCHER category。如果要Activity响应其他应用的隐式的intent,则需要为Activity声明对应action,还可以添加categor和data。

3.Activity的启动

3.1 startActivity

        通过调用startActivity(intent)启动Activity,intent用来准确的描述你要启动的Activity,或者你要进行的action,intent也可以用来携带小数据给被启动Acitivity。

         当在同一个应用中间需要简单启动另一个Activity,intent明确的定义你要启动Activity类即可:

1
2
3
4
5
6
7
//定义一个intent,指名要启动的activity:ToStartActivity 
 
Intent intent =   new  Intent(MainActivity. this ,ToStartActivity. class ); 
 
//使用startActivity(),启动activity 
 
startActivity(intent); 

 

           在你的应用程序需要执行一些自身没有Activity可以执行的行为时,我们可以使用手机上的其他应用程序的Activity来代替执行。比如发送一个mail、查看一张图片、搜索一个单词等等。这个里也就是Intent的重要指出,你可以定义一个intent描述你想要做的行为,等你发送给系统后,系统会启动合适的Acitivty帮你执行,如果有多个应用的Activity都可以处理此行为时,系统会让用户去选择一个。当此Activity执行完毕后,原来的Activity将比

              

1
2
3
4
5
6
7
//跨应用从google界面搜索 
 
               Intent intent =  new  Intent(Intent.ACTION_WEB_SEARCH); 
 
               intent.putExtra(SearchManager.QUERY,  "zy" ); 
 
               startActivity(intent); 

 

     当跨应用启动Activity时,在定义intent时必须要为他指定具体的acitvity,前提是此activity必须暴露在自己应用程序之外(android:exported="true"):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Intent intent =  new  Intent(); 
 
//指定要启动组建完整的包名,对象名 
 
ComponentName cn =  new  ComponentName( "com.android.settings"
 
         "com.android.settings.RunningServices" ); 
 
intent.setComponent(cn); 
 
// 使用context.startActivity()时需要新启一个任务 
 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
 
startActivity(intent); 

 

3.2 startActivityForResult

       通过调用 startActivityForResult(intent),来接收到启动的Acitivity反馈的结果。为了接收接下来启动的Activity的结果,需要重写onActivityResult()这个回调函数。当调用的activity完成后,它将返回一个含有结果的intent给onActivityResult()处理。比如,在应用程序的Activity中,需要用户选择联系人中的一个,Activity需要得到联系人的部分信息:

         

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
31
32
33
34
35
36
37
38
39
40
41
42
43
Intent intent =  new  Intent(Intent.ACTION_PICK, 
 
                         Contacts.People.CONTENT_URI); 
 
                 //启动一个带有选择联系人返回结果的activity 
 
                 startActivityForResult(intent, PICK_CONTACT_REQUEST); 
 
           这里的PICK_CONTACT_REQUEST为自定义的 int 型请求反馈结果代码。
 
//重新onActivityResult()用来处理接收到的返回结果 
 
@Override 
 
protected  void  onActivityResult( int  requestCode,  int  resultCode, Intent data) { 
 
     // 如果请求requestCode成功,且请求返回的结果resultCode是我们要的PICK_CONTACT_REQUEST 
 
     if  (resultCode == Activity.RESULT_OK 
 
             && requestCode == PICK_CONTACT_REQUEST) {            
 
         // 处理Intent返回的数据,在联系人数据库中查找联系人的名字 
 
         Cursor cursor = getContentResolver().query(data.getData(), 
 
                 new  String[] { Contacts.People.NAME },  null null null ); 
 
           
 
         if  (cursor.moveToFirst()) {  // 如果cursor不为空,就查找出联系人的名字 
 
             int  columnIndex = cursor.getColumnIndex(Contacts.People.NAME); 
 
             String name = cursor.getString(columnIndex); 
 
             //添加其他功能 
 
        
 
    
 
}    

 

        这里在要说明是onActivityResult()使用来处理返回结果的,首先要检查的是请求是否成功,然后是否有返回结果,结果是否是startActivityForResult()中所要的,如果满足,则处理通过Intent返回的数据。

4.关闭Activity

1  Activity可以调用finish()方法关闭自己,也可以通过调用finishActivity()的方法关闭一个独立的之前启动的Activity。

2 调用finishActivity()的方法关闭一个独立的之前启动的Activity

 //此方法用在关闭使用startActivityForResult(requestCode)启用的Activity  

 this.finishActivity(requestCode);  

           关于何时关闭一个Activity,一般由系统直接为我们管理。但是当你确认用户不用返回到此Activity时,我们调用以上方法关闭对应的Activity。

 

5 Demo代码:

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
31
32
33
34
35
36
37
38
39
40
41
42
package  mm.shandong.com.testusea;
 
import  android.content.Intent;
import  android.support.v7.app.AppCompatActivity;
import  android.os.Bundle;
import  android.view.View;
 
public  class  TestUseAActivity  extends  AppCompatActivity {
 
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test_use_a);
     }
    //启动第一个activity
     public  void  startFirstActivity(View view) {
         Intent intent =  new  Intent( this , TestUseAActivity2. class );
         startActivity(intent);
     }
     //启动第二个activity
     public  void  startSecondActivity(View view) {
         Intent intent =  new  Intent( this , TestUseAActivity3. class );
         startActivity(intent);
     }
     //启动第三个activity,这个activity 4秒钟后被关闭
     public  void  startThirdActivity(View view) {
         Intent intent =  new  Intent( this , TestUseAActivity4. class );
         startActivityForResult(intent,  1 );
         new  Thread() {
             @Override
             public  void  run() {
                 try  {
                     Thread.sleep( 4000 );
                     finishActivity( 1 );
                 catch  (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         }.start();
 
     }
}

你可能感兴趣的:(Java)