组件Intent是一个用于指定目标组件的类(可以实现两个组件之间的通信),结合前面所学以及今天所学,大概有以下几种指定的方式
1、指定当前组件对象以及目标组件的class
Intent i = new Intent(currentComponent.this,aimComponent.class);
2、通过指定目标组件包名以及类名进行指定,例如我要指定位于包com.xiaotong.myapp中的Aty1
<pre name="code" class="java">Intent i = new Intent();
i.setComponent(new ComponentName("com.xiaotong.myapp", "com.xiaotong.myapp.Aty1"));
首先需要在AndroidManifest.xml的application节点中创建相关组件配置节点,然后在配置节点中添加<Intent filter></Intent filter>
标签,再此标签中指定指定该组件的action、category、data标签
<activity
android:name="com.xiaotong.myapp.ImageViewer"
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen">
<intent-filter >
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*" android:scheme="file"/>
</intent-filter>
</activity>
注意:category不可缺失,否则将打不开该组件,一般使用
android.intent.category.DEFAULT
然后就进行指定了,这里以打开一个图片为例(打开各类文件用此方法)
File f=new File("mnt/sdcard/1.jpg");
Intent i = new Intent(Intent.ACTION_VIEW);
<span style="font-family: Arial, Helvetica, sans-serif;">i.setDataAndType(Uri.fromFile(f),"image/*");</span>
startActivity(i);
如果是调用其他的app(不需要说明type),这里以给10086打电话以及打开百度网页为例
Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:10086"));
<pre name="code" class="java">Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("http://baidu.com"));
关于Intent Filter,一个过滤器,系统在发送某个Intent时,会扫描组件<Intent Filter />标签,如果符合相关条件便会让用户选择打开方式:
跟多内容可以参考
IntentFilter
这里有一个创建的图片查看器
package com.xiaotong.myapp;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
public class ImageViewer extends Activity {
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
iv = new ImageView(this);
setContentView(iv);
iv.setImageURI(getIntent().getData());
}
}
package com.xiaotong.myapp;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btnAty1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Intent i = new Intent();
// i.setComponent(new ComponentName("com.xiaotong.myapp", "com.xiaotong.myapp.Aty1"));
Intent i = new Intent("com.xiaotong.myapp.intent.action.Aty1");
startActivity(i);
}
});
findViewById(R.id.btnOpenImage).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
File f=new File("mnt/sdcard/1.jpg");
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.fromFile(f),"image/*");
startActivity(i);
}
});
findViewById(R.id.btntel10086).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("tel:10086"));
startActivity(i);
}
});
findViewById(R.id.btnCBD).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("http://baidu.com"));
startActivity(i);
}
});
}
}
Aty1.class:
package com.xiaotong.myapp;
import android.app.Activity;
import android.os.Bundle;
public class Aty1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.aty1);
findViewById(R.id.aty1);
}
}
ImageViewer.class:
package com.xiaotong.myapp;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
public class ImageViewer extends Activity {
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
iv = new ImageView(this);
setContentView(iv);
iv.setImageURI(getIntent().getData());
}
}