facebook廣告





123

2016年9月19日 星期一

Android Intent 意图

Intent 是一种消息传递机制,可以在应用程序内使用,也可以在应用程序间使用。intent对象是组件间通信信息的载体。它封装了调用组件提供的指令和数据,他哦拿过组件管理服务序列化传递给实现组件,实现组件可以利用这些信息完成所需功能。​
  • 显示的启动一个特定的activity。
如果自己在写app的时候,比如从一个商品简介中点击跳转到这个商品的详细页,就可以使用intent来传递。
public class MainActivity extends Activity implements OnClickListener {
@Override
 public void onClick(View v) {
  // TODO Auto-generated method stub
  switch (v.getId()) {
  case R.id.button1:
   // 不要忘了在AndroidManifest中声明otherActivity
   Intent n = new Intent(MainActivity.this, otherActivity.class);
   startActivity(n);
   // startService(intent)
   // sendBroadcast(intent)
   break;
  default:
   break;
  }
 }
}
如上代码,在调用了startActivity之后,新的otherActivity将会被创建,启动和恢复运行,它会移动到activity栈的顶部。也可以用intent来启动一个server或者发一个广播。
不要忘了在AndroidManifest中声明otherActivity
  • 原生的android动作
有很多原生的可以动作,比如打开短息,给某个电话打电话,打开某个网址登,他没有明显的打开一个acivity
@Override
 public void onClick(View v) {
  // TODO Auto-generated method stub
  switch (v.getId()) {
  case R.id.button2:
   Intent intent = new Intent();
   // intent.setAction(Intent.ACTION_DIAL);
   // intent.setData(Uri.parse("tel://5556"));

   intent.setAction(Intent.ACTION_VIEW);
   intent.setData(Uri.parse("http://www.google.com"));
   //
   // Uri sms = Uri.parse("smsto://5556");
   // intent = new Intent(android.content.Intent.ACTION_SENDTO,sms);

   // 确认Intent是否解析
   PackageManager pm = getPackageManager();
   ComponentName cn = intent.resolveActivity(pm);
   if (cn == null) {
    Uri marketUri = Uri.parse("market://search?q=pname:浏览器");
    Intent marketIntent = new Intent(intent.ACTION_VIEW)
      .setData(marketUri);
    if (marketIntent.resolveActivity(pm) != null) {
     startActivity(marketIntent);
    }
   } else {

    startActivity(intent);
   }
   break;
  default:
   break;
  }
 }
在上面的代码中,分别举出了向5556打电话,打开google,向5556发短信这样的动作。
但是你无法保证用户设备上安装了特定的某个应用程序可以处理你的请求,因此在调用startActivity之前,确定一下调用是否可以解析为一个activity是一种很好的习惯,保证代码的健壮性。
  • 从Activity返回结果
通过startActivity启动的activity独立与其父Activity,并且在关闭的时候不会提供任何反馈。
当需要反馈的时候,可以使用startActivityForResult.
public class MainActivity extends Activity implements OnClickListener {
 @Override
 public void onClick(View v) {
  // TODO Auto-generated method stub
  switch (v.getId()) {
  
  case R.id.button3:
   // 不要忘了在AndroidManifest中声明otherActivity
   Intent n1 = new Intent(MainActivity.this, otherActivity.class);
   startActivityForResult(n1, 2);

   // Uri uri= Uri.parse("content://contacts/people");
   // Intent n2= new Intent(Intent.ACTION_PICK,uri);
   // startActivityForResult(n2, 1);
   break;
  default:
   break;
  }
 }
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  // TODO Auto-generated method stub
  super.onActivityResult(requestCode, resultCode, data);
  Log.i(TYPE, String.valueOf(requestCode));
  switch (resultCode) {
  case RESULT_OK:
   String result = data.getExtras().getString("result");
   Log.i(TYPE, result);
   break;

  default:
   break;
  }
 }

}
启动和startActivity的方式是一样的,只是多了一个方法名换了,多了一个参数requestCode.requestCode >=0就好,用于在onActivityResult()区别哪个子activity回传的数据,如果还有activity1 ,activity2的话,每个区分开不同的requestCode就好。
同时要重写onActivityResult.
在子activity中
public class otherActivity extends Activity {

 private Button btn1;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.other_main);
  btn1 = (Button) findViewById(R.id.button4);
  btn1.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent data = new Intent();
    data.putExtra("result", doSomething());
    // 这里也可以自定义
    setResult(RESULT_OK, data);
    // 关闭掉这个Activity
    finish();
   }
  });
 }

 public String doSomething() {
  return "have done something! ";
 }

}
setResut(int resultCode, Intent intent)
resultCode 如果子activity可能有几种不同的结果返回,可以用自定义不同的值予以识别区分。没有特殊情况,用 RESULT_OK 就可以。
  • pendingInent
pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。Intent 是及时启动,intent 随所在的activity 消失而消失。 PendingIntent 可以看作是对intent的包装,通常通过getActivity,getBroadcast ,getService来得到pendingintent的实例,当前activity并不能马上启动它所包含的intent,而是在外部执行 pendingintent时,调用intent的。正由于pendingintent中 保存有当前App的Context,使它赋予外部App一种能力,使得外部App可以如同当前App一样的执行pendingintent里的 Intent, 就算在执行时当前App已经不存在了,也能通过存在pendingintent里的Context照样执行Intent。另外还可以处理intent执行后的操作。常和alermanger 和notificationmanager一起使用。
 public void showNo(){
  
  NotificationCompat.Builder mBuilder=  new NotificationCompat.Builder(this); 
  Intent notificationIntent = 
new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
  PendingIntent contentIntent = 
PendingIntent.getActivity(this, 0, notificationIntent, 0);
  mBuilder.setContentTitle("My notification")  
     .setContentText("Hello World!") 
     .setContentIntent(contentIntent) 
     .setTicker("hello ,you have a notification") 
     .setWhen(System.currentTimeMillis())   
     .setSmallIcon(R.drawable.ic_launcher); 
   NotisManager.notify(1, mBuilder.build());
 }
在通知里面跳转到baidu这个动作就是用pendingInent来封装的。但是在发送这个通知的时候是不执行的,只有点击了之后,才会执行。
其他相关的,内容比如在以后补充
  1. intent和service
  2. Intent和广播
  3. Intent Filter
http://pan.baidu.com/s/1c0GT0aO

沒有留言:

張貼留言