安卓-啓動Activity的兩種方式

啓動Activity有兩種方式:

1)startActivity

2)startActivityForResult

方式1,啓動後不關心activity返回的結果

方式2,啓動後可以接收activity返回的結果,接收結果需要在onActivityResult函數中處理。

下面我們來看下這個函數

protected void onActivityResult(int requestCode, int resultCode, Intent data)

第一個參數是請求碼,自己傳過去的,可以是任意的int類型的值;

第二個參數是結果碼,返回結果時返回的狀態碼,可以是任意的int類型的值;

第三個參數是返回的數據,數據,默認數據是通過Intent傳輸的。有了Intent就可以拿到返回的數據。

在啓動之後的Activity中獲取傳遞的Intent,Intent intent  = getIntent();

下面通過一個demo來演示下兩種啓動Activity的方式,其中第二種方式中啓動時傳遞了參數,啓動後的Activity在返回時返回了數據,demo中將傳遞的數據和返回的數據及請求碼和返回碼均以日誌的方式進行了打印。

demo講解:

1)主Activity使用了ListActivity,加了兩行數據,分別顯示:“啓動Activity不傳參數不返回數據” 和 "啓動Activity傳參數並返回數據"

代碼如下:

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

/**
 * Created by wangwentao on 2017/2/20.
 */

public class StartActivitySelActivity extends ListActivity {
    private static final String TAG = "StartActivitySelActivit";
    public final static int REQUEST_CODE = 1;
    public final static int RESULT_CODE = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //1.數據源
        String[] data = {"啓動Activity不傳參數不返回數據","啓動Activity傳參數並返回數據"};

        //2.適配器
        @SuppressWarnings("unchecked")
        ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data);
        //3.綁定
        setListAdapter(arrayAdapter);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        if (0 == id){//啓動Activity不傳參數不返回數據
            startActivity(new Intent(StartActivitySelActivity.this, NoParamsActivity.class));
        }else if(1 == id){//啓動Activity傳參數並返回數據
            Intent intent = new Intent();
            intent.putExtra("name_data","小明");
            intent.putExtra("age_data",25);
            intent.setClass(StartActivitySelActivity.this, ForResultActivity.class);
            startActivityForResult(intent,REQUEST_CODE);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.i(TAG, "onActivityResult: requestCode="+requestCode+";resultCode="+resultCode);
        if(requestCode == REQUEST_CODE && resultCode == RESULT_CODE){
            String strName = data.getStringExtra("return_name");
            int nAge = data.getIntExtra("return_age",0);
            Log.i(TAG, "返回數據: return_name="+strName+";return_age="+nAge);
            Toast.makeText(StartActivitySelActivity.this,"返回數據:姓名:"+strName+"; 年齡:"+nAge,Toast.LENGTH_SHORT).show();
        }
    }
}
2)第一種方式啓動後是一個Activity,界面中只有兩個控件:文本控件和按鈕,文本控件提示"啓動Activity不傳參數不返回數據",按鈕用於返回上一個Activity

第一種方式跳轉的界面的佈局文件activity_no_params.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_no_params"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/id_tv_tip"
        android:layout_marginTop="20dp"
        android:textAllCaps="false"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="啓動Activity不傳參數不返回數據"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="btnOnClick"
        android:text="返回"/>

</LinearLayout>

第一種方式跳轉後的Activity的代碼:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.mobile.cdtx.blog.R;

public class NoParamsActivity extends AppCompatActivity {

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

    //返回按鈕點擊事件
    public void btnOnClick(View v){
        this.finish();
    }
}

3)第二種方式跳轉的界面的佈局activity_for_result.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_for_result"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/id_btn_get"
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="獲取傳遞的數據"/>

    <Button
        android:id="@+id/id_btn_finish"
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="回傳數據並結束"/>

    <TextView
        android:id="@+id/id_tv_text"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="展示傳遞的參數"/>

</LinearLayout>

第二種方式跳轉的Activity的代碼

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.mobile.cdtx.blog.R;

public class ForResultActivity extends AppCompatActivity implements View.OnClickListener{
    public final static int RESULT_CODE = 2;
    Button btnGet,btnFinish;
    TextView tvText;
    private String strName;
    int nAge;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_for_result);
        //控件初始化
        initView();

        //解析傳遞的參數
        Intent intent  = getIntent();
        strName = intent.getStringExtra("name_data");
        nAge = intent.getIntExtra("age_data",0);
    }

    //控件的初始化
    private void initView(){
        btnGet = (Button)findViewById(R.id.id_btn_get);
        btnFinish = (Button)findViewById(R.id.id_btn_finish);
        tvText = (TextView)findViewById(R.id.id_tv_text);
        btnGet.setOnClickListener(this);
        btnFinish.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
         switch (v.getId()){
             case R.id.id_btn_get:
                 showParam();
                 break;
             case R.id.id_btn_finish:
                 finishActivity();
                 break;
             default:
                 break;
         }
    }

    //提示傳遞的參數
    private void showParam(){
        String strText = "收到的參數:name_data="+strName+";age_data="+nAge;
        tvText.setText(strText);
    }

    //回傳數據並結束
    private void finishActivity(){
        Intent intent = new Intent();
        intent.putExtra("return_name","張三");
        intent.putExtra("return_age",12);
        this.setResult(RESULT_CODE,intent);
        this.finish();
    }
}
效果圖




4)打印的日誌如下:

02-20 10:01:36.697 10362-10362/com.mobile.cdtx.blog I/StartActivitySelActivit: onActivityResult: requestCode=1;resultCode=2
02-20 10:01:36.697 10362-10362/com.mobile.cdtx.blog I/StartActivitySelActivit: 返回數據: return_name=張三;return_age=12

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章