当我们打开一个Activity时,我们就会用到Intent(意图),正如它名字一样,我们可以发送一个Intent对象来让系统打开我们所需要的组件。
比如,打开一个Activity:在我们的app中,一个Activity会占用整个屏幕。我们可以创建一个新的Activity实例将Intent对象传递给Context.startActivity(Intent intent)方法,这个Intent描述啦你想要打开的Activity以及可以携带一些你想要的信息。当我们打开的Activity结束时,如果有信息返还,则在发送Intent时调用startActivityForResult(Intent intent,int requestCode)方法,第二个参数为你发送请求的参数,可以发送不同的请求,来对结果进行不同的处理,同时,还要在发送Intent的Activity中重写onActivityResult(int requestCode,int resultCode,Intent data)方法,第一个参数为你发送的请求状态码,第二个参数为返回的结果状态码,第三个参数为携带返回的数据的Intent。
接下来是一个简单的demo,创建两个简单的Activity,布局比较简单,就不贴啦。
MainActivity.java
package com.flying.xiaopo.intentdemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity implements View.OnClickListener { private Button btn_start_activity, btn_start_activity_for_result; public static final int REQUEST_CODE = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_start_activity = (Button) findViewById(R.id.btn_start_activity); btn_start_activity_for_result = (Button) findViewById(R.id.btn_start_activity_for_result); btn_start_activity.setOnClickListener(this); btn_start_activity_for_result.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(this, SecondActivity.class); switch (v.getId()){ case R.id.btn_start_activity: startActivity(intent); break; case R.id.btn_start_activity_for_result: setResult(RESULT_OK,intent); startActivityForResult(intent,REQUEST_CODE); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Toast.makeText(this,"requestCode is" + requestCode + ",resultCode is" + resultCode,Toast.LENGTH_SHORT).show(); } }
SecondActivity.java
package com.flying.xiaopo.intentdemo; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; /** * Created by lenovo on 2015/6/21. */ public class SecondActivity extends Activity { private Button btn_back; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); btn_back = (Button) findViewById(R.id.btn_back); Log.d("TAG", "Create"); btn_back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setResult(RESULT_OK); finish(); } }); } }
接下来看一下效果:
当我们直接startActivity时,关闭打开的Activity,并没有结果返回,而当我们通过startActivityForResult打开时,当被打开的Activity调用finish()方法时,向其父Activity传递啦结果码,当然这里没有绑定data,具体方法可以查API哈。
Caution:这里传递intent的Activity不可以finish(),要是同一个实例。
同时,通过Intent,我们可以打开许多不同的组件,比如打开一个服务,调用startService()或调用bindService(),接受一个BroadReciver,通过调用sendBroadcast(),sendOrderedBroadcast()或sendStickyBroadcast()方法,具体的在我整理Service和Broadcast时会写把。