Android 学习系列 - Itent

Android Intent

关于

对比android 和 IOS的很大不同点是, iOS的应用是沙箱,android的应用却可以相互调用。 而Intent主要解决的问题就是解决android 应用组件之间的通讯问题。 Intent
也可以理解为对将要执行的操作的抽象描述。

构造

public Intent(Context packageContext, Class cls)

Intent 启动activity

// Activity 继承自Context的startActivity 方法public abstract void startActivity(Intent intent, Bundle options);// 创建itentIntent i = new Intent(this, ImageActivity.class);startActivity(i);

可以通过 Intent 传递一些 Flags(标识)来通知 ActivityManager 去改变既定行为。

传递值

// 传递数据, extras 存储在 Android 的 Bundle中,Bundle 在这里可以被看做是一个可序列化的容器。i.putExtra("A_BOOLEAN_EXTRA", true); //boolean extrai.putExtra("AN_INTEGER_EXTRA", 3); //integer extrai.putExtra("A_STRING_EXTRA", "three"); //integer extra// imageActivityif (getIntent() != null ) {    //确认Intent非空后,可以进行诸如从extras取值什么的…    int value = getIntent().getIntExtra("AN_INTEGER_EXTRA", 0); //名称,默认值}

假如一个对象已实现序列化接口 Serializable。接下来可以这么做:

YourComplexObject obj = new YourComplexObject();Intent i = new Intent(this, ImageActivity.class);i.putSerializable("SOME_FANCY_NAME", obj); //使用接收序列化对象的方法startActivity(i);

YourComplexObject obj = (YourComplexObject) getIntent().getSerializableExtra("SOME_FANCY_NAME");

Itent 启动服务

Intents 和 Services 是怎么协作的呢?

首先需要一个 Intent 来启动 Service。而 Service 启动后,只要其处于非 stopped 状态,就可以持续地向它发送指令,直到它被停止(在这种情况下它将会重新启动)。

在某个 Activity 中启动服务:

Intent i = new Intent(this, YourService.class);i.setAction("SOME_COMMAND");startService(i);

接下来程序执行情况取决于当下是否第一次启动服务。如果是,那么服务就会自然启动(首先执行构造方法和 onCreate() 方法)。如果该服务已经启动过,将会直接调用 onStartCommand() 方法。

@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {    String action = intent.getAction();    if (action.equals("SOME_COMMAND")) {        // SOME_COMMAND 具体事件内容)    }    return START_NOT_STICKY; // 如果服务已被杀掉,不要重新启动服务}

发送和接收到广播

private final class ServiceReceiver extends BroadcastReceiver {
public IntentFilter intentFilter;
public ServiceReceiver() {
super();
intentFilter = new IntentFilter();
intentFilter.addAction("ACTION_PLAY");
intentFilter.addAction("ACTION_STOP");
intentFilter.addAction("ACTION_ERROR");
}
@Override
public void onReceive(final Context context, final Intent intent) {
if (intent.getAction().equals("ACTION_ERROR")) {
// 由于有错误发生,播放停止
} else if (intent.getAction().equals("ACTION_PLAY")){
// 播放视频
}
// 等等…
}
}
// Context 抽象方法
public abstract Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter);

@Overridepublic void onStart() {    onStart();      registerReceiver(mServiceReceiver, mServiceReceiver.intentFilter);}@Overridepublic void onStop() {    super.onStop();    unregisterReceiver(mServiceReceiver);}

判断一个intent是否能被接受

如果应用依赖外部的activity, 但是不能保证外部应用是否已经安装, 那么可以通过packageManger来判断

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:13422272867"));PackageManger pm = getPackageManager();ComponentName cn = intent.resolveActivity(pm);if (cn == null) {    // things to do when no resolver activity     // download the application} else {    startActivity(intent);        }

sub-activity onActivityResult()

当应用需要依赖外部应用返回值的时候,比如本地照片获取activity
启动方式为:

startActivityForResult(intent);@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    switch (requestCode) {        //.....    }}

关键字:产品经理

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部