android activity跳转怎么传对象

android activity跳转怎么传对象,第1张

Android之Activity的几种跳转方式 1显示调用方法Intent intent=new Intent(this,OtherActivityclass); //方法1Intent intent2=new Intent();intent2setClass(this, OtherActivityclass);//方法2intent2setClassName(this, "comzyMutiActivityOtherActivity"); //方法3 此方式可用于打开其它的应用intent2setComponent(new ComponentName(this, OtherActivityclass)); //方法4startActivity(intent2);然后调用finish():结束当前Activity 2隐式调用方法(只要action、category、data和要跳转到的Activity在AndroidManifestxml中设置的匹配就OK3跳转到另一个Activity后,当返回时能返回数据在跳转的Activity端,调用startActivityForResult(intent2, 1),跳转到下一个Activity,其中第一个参数为传入的意图对象,第二个为设置的请求码;跳转到第二个Activity后,调用setResult(100, intent)方法可返回上一个Activity,其中第一个参数为结果码,第二个为传入的意图对象;在第一个Activity通过onActivityResult()方法获得返回的数据。

1、onCreate 方法只在activity一开始创建的时候执行。

2、也就是在该activity销毁后才能再次执行,假如当前activity上再打开一个activity,并且原来的activity已经销毁了,再返回原来的activity会重新执行onCreate

3、可以通过activity的生命周期的onStart方法或者是onResume方法对原来界面的数据进行刷新,也可以使用回调方法,或者是handler + Message

activity是栈的方式存储的,当你跳到第二个activity时,第一个被push到栈中,第二个activity中的back事件没有处理的话,默认是pop第一个栈,也就是返回第一个activity。这个时候,你再back才是执行第一个activity中的你定义的back事件——退出。

在A里用startActivityForResult启动B,退出B后A能接受到B的值,跳转C前把B传过来的值用intent也一起传过去,或者不关闭A,也是用startActivityForResult启动C,C关闭后值传回来到A里

现有MainActivity,当它进入到SecondActivity后,在SecondActivity中进行了某些 *** 作然后需要将值返回给MainActivity时,

于是就可以用到onActivityResult() 这个方法了,下面呢,我就具体来介绍一下用法。

不过在这之前,先讲一下intent的用法:

对于intent主要的分类主要包括隐式意图和显式意图。显式意图通常主要是启动本应用中的Activity之间的数据,

而隐式意图则常见于启动系统中的某些特定的动作,比如打电话,或者是跨应用的Activity启动。

一般来说:

显式意图:调用IntentsetComponent()或IntentsetClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、

数据(URI和数据类型)找到最合适的组件来处理这个意图。

1、MainActivity里面的主要代码

(1)当需要返回值时,那么在启动另一个Activity时要用到startActivityForResult(intent, REQUEST_CODE);

注意第二个参数是请求的int类型的值,这个值要在onActivityResult()方法中和requestCode做判断的,

由此来判断是启动的某个Activity。

(2)onActivityResult()方法中的第二个参数就是SecondActivity传回来的键,

第三个参数就是SecondActivity传回来的键对应的值。

final int RESULT_CODE=101;

final int REQUEST_CODE=1;

public void enterSecond(View view) {

Intent intent=new Intent(this,SecondActivityclass);

startActivityForResult(intent, REQUEST_CODE);

}

@Override

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

Logi(TAG, "onActivityResult"+"requestCode"+requestCode+"\n resultCode="+resultCode);

if(requestCode==REQUEST_CODE) {

if(resultCode==RESULT_CODE) {

String result=datagetStringExtra("second");

textViewsetText(result);

}

}

superonActivityResult(requestCode, resultCode, data);

}

2、SecondActivity 类中的代码:

这个里面的RESULT_CODE、intent分别跟上段代码中onActivityResult()方法中的第二个、第三个参数相对应。

final int RESULT_CODE=101;

public void closeButton(View view) {

Intent intent=new Intent();

intentputExtra("second", "I am second!");

setResult(RESULT_CODE, intent);

finish();

}

3、除此之外,onActivityResult()方法中的第二个参数resultCode还有系统自带的一些参数,也就是说,如果我们启动的intent是隐式意图,那么可以用Activity类中RESULT_OK来表示 *** 作已经顺利结束。

例如,调用系统图库的返回,请看代码:

final int CROP_PIC_REQUESTCODE = 23;

final int SELECT_PICTURE = 21;

if (resultCode == RESULT_OK && requestCode == SELECT_PICTURE) {

Systemoutprintln("调用图库返回,关闭activity");

Intent intent1 = new Intent("comandroidcameraactionCROP");

intent1setDataAndType(datagetData(), "image/");

intent1putExtra("crop", "true");

intent1putExtra("aspectX", 1);

intent1putExtra("aspectY", 1);

intent1putExtra("outputX", 80);

intent1putExtra("outputY", 80);

intent1putExtra("return-data", true);

startActivityForResult(intent1, CROP_PIC_REQUESTCODE);

}

当然,我们还可以看下源码中还有哪些类似RESULT_OK的。

/ Standard activity result: operation canceled /

public static final int RESULT_CANCELED = 0;

/ Standard activity result: operation succeeded /

public static final int RESULT_OK = -1;

/ Start of user-defined activity results /

public static final int RESULT_FIRST_USER = 1;

总结:本来我只是想使用一下显示intent启动Activity的方式,后来我又自己扩展了隐式intent启动Activity。

总之,碰到问题,要多思考,不要拘泥在一个点上,这样自己才会真正的进步。

如果大家有什么更好的建议和看法,一定要提出来,互相切磋,共同进步是我们技术宅最大的愿望啊,很高兴和大家分享!

Activity_A:

1、使用startActivityForResult(Intent intent, int requestCode) 方法打开Activity;

Intent nextIntent =new Intent(this, TwoActivityclass);

Bundle bd=new Bundle();

bdputString("name", "xioaming");

bdputInt("age",25);

nextIntentputExtra("bundle", bd);

startActivityForResult(nextIntent, 100);

1

2

3

4

5

6

1

2

3

4

5

6

2、 重写onActivityResult(int requestCode, int resultCode, Intent data) 方法;

@Override

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

// TODO Auto-generated method stub

superonActivityResult(requestCode, resultCode, data);

if(data==null){

return;

}

String name=datagetStringExtra("name");

Systemoutprintln(resultCode+"返回的结果为"+name);

}

1

2

3

4

5

6

7

8

9

10

11

12

1

2

3

4

5

6

7

8

9

10

11

12

Activity_B

3、新Activity中调用setResult(int resultCode, Intent data) 设置返回数据之后,关闭Activity就会调用上面的onActivityResult方法;

private void returnResult() {

Intent intent=new Intent();

intentputExtra("name", "xiaohong");

setResult(100, intent);

}

1

2

3

4

5

1

2

3

4

5

打开CSDN APP,看更多技术内容

java关闭活动,如何关闭活动并返回到android中的先前活动

回答(16)2 years ago我认为你在启动 SettingsActivity 之前在 MainActivity 中调用 finish() 方法 您描述的方案将以下列两种方式发生:无论是您已在 AndroidManifestxml 内为 MainActivity 设置 android:noHistory = "true" ,这会在按后退键时自动导致 MainActivity 到 finis

继续访问

Activity的关闭返回指定页面

问题: 如何在本Activity页面退出后回到首页或者指定的Activity入口。假如你在D页面,想退出当前activity时回到最初的首页入口A页面,中间有B、C两个页面。 思路: 退出本页面finish即可。将首页置于任务栈栈顶,将其他的activity清除出栈;自定义工具类AppManager;在结束的activity页面的功能代码中加入代码: AppManage

继续访问

Activity中得到新打开Activity关闭后返回的数据(onActivityResult和setResult方法的使用)

如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity传回数据,为了

继续访问

activity之间参数传递&&获取activity返回值&&activity生命周期

Activity之间参数传递 A activity想将参数传给B activity时可以利用Intent将消息带过去 Intent intent = new Intent(this,BActivityclass); intentputExtra("xxxx", "xxxx"); 数据量多的话可以使用 Bundle bundle = new

继续访问

得到新打开Activity 关闭后返回的数据

如果你想在Activity中得到新打开Activity 关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity 传回数据,为了得到传回的数据,你必须在前面的Activity中重写onActivityResult(int re

继续访问

Android activity销毁时返回数据:

activity销毁时返回数据:1activity销毁时返回数据。 ListView lv = (ListView)findViewById(Ridlv); lvsetAdapter(new ArrayAdapter<String>(this,Rlayoutitem_listview,Ridtv,objects)); //设置条目点击事件 lvsetOnItemCl

继续访问

android activity返回数据,从Activity中返回数据

从Activity中返回数据一、简介这里也就是使用intent方式返回数据。二、具体步骤在MainActivity通过一个button访问Activity01页面,然后将Activity01页面的数据返回到MainActivity页面。调用Activity页面:MainActivity被调用页面:Activity01接收值页面:MainActivity传值页面:Activity011、将调用页面的

继续访问

Activity销毁时返回数据

package comskkkservice; import androidcontentIntent; import androidosBundle; import androidsupportv7appAppCompatActivity; import androidviewView; import androidwidgetButton; import andr

继续访问

Activity返回数据

目录概述StartActivityForResult()onActivityResult()完整的Activity切换发起方代码setResult()完整的Activity切换接收方代码 概述  可以直接使用startActivity(Intent intent)方法从一个Activity跳转至另一个Activity,但有时候需要Activity返回数据,例如:  Activity_A开启了Act

继续访问

热门推荐 从头学android从新的Activity中返回数据给前一个Activity

1起始Activity / / package comitest; import androidappActivity; import androidcontentIntent; import androidosBundle; import androidviewView; import androidviewViewOnClickListener;

继续访问

19 activity间传递数据 关闭时返回数据

效果:关闭other_activity是返回数据给main_activity

继续访问

Activity实现数据的回传

这一段的话我们直接使用代码来演示: 在mainActivity中的代码 package comexampleresult; import androidxappcompatappAppCompatActivity; import androidcontentIntent; import androidosBundle; import androidviewView; import androidwidgetToast; public class MainActivity e

继续访问

启动Activity并获取返回结果

启动另一个Activity并不是单向的 *** 作,您也可以启动另一个Activity并获取返回结果。startActivity()只启动另一个Activity,startActivityForResult()启动另一个Activity且获取返回结果。 例如,您的APP可以启动相机APP,并获取捕获的照片。或者,您的APP启动联系人APP,以便用户选择联系人,然后您的APP将收到用户所选联系人的详细信息

继续访问

activity数据回传过程(返回数据给上一个活动)

1一个类的super记得要继承下来。 2不要用数字用常量。 3如果仅仅就是赋值的话就不用new了。 4强制类型转换,在最前面加(要转换到的类型) 例如:(MessageInfo)getIntent()getParcelableExtra(KEY_ACTIVITY_FLAG); 就是把parce类型强制转化为MessageInfo类型 5一个a

继续访问

android activity返回事件,Activity系列讲解---返回结果的处理

设想一下:由当前Activity跳转到其它Activity,从其它Activity再返回到当前Activity时,如何获取其它Activity存放的数据?下面用一个例子讲解,点击selsect按钮跳转到另一界面,同时选择一个电话号码;然后将这个电话号码带回来显示在当前界面的EditText上。1代码实现:(1)ResultActivityclass/结果界面/public class

继续访问

最新发布 Android 组件通信 activity通过按钮实现页面跳转并携带返回数据

设计一个主Activity和一个子Activity(Sub-Activity),使用主Activity上的按钮启动子Activity,并将子Activity的一些信息返回给主Activity,并显示在主Activity上。 主Activity界面上有一个“登录”按钮和一个用了显示信息的TextView,点击“登录”按钮后打开一个新的Activity,新Activity上面有输入用户名的控件,在用户关闭这个Activity后,将用户输入的用户名到主Activity,并显示在主Activity的TextVie

继续访问

Android(Java):得到新打开Activity 关闭后返回的数据

如果你想在Activity中得到新打开Activity 关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity 传回数据,为了得到传回的数据,你必须在前面的Activity中重写onActivityResult(int

继续访问

Android中的onActivityResult和setResult方法的使用

如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity传回数据,为了得到传回的数据,你必须在前面的Activity中重写onActivityResult(int re

继续访问

数据

Activity作为安卓四大组件之一,是最重要也是用得最多的组件,涉及的知识点非常多,有些知识点平时开发很少用到,但在某些场景下需要特别注意,本文详细整理了Activity涉及的知识点,供开发参考。

针对Activity可以提出很多问题,如:

Activity 的生命周期?

Activity 之间的通信方式?

Activity 各种情况下的生命周期?

横竖屏切换时 Activity 的生命周期?

前台切换到后台,然后再回到前台时 Activity 的生命周期?

d出 Dialog 的时候按 Home 键时 Activity 的生命周期?

两个Activity之间跳转时的生命周期?

下拉状态栏时 Activity 的生命周期?

Activity 与 Fragment 之间生命周期比较?

Activity 的四种 LaunchMode(启动模式)的区别?

Activity 状态保存与恢复?

Activity的转场动画有哪些实现方式?

Activity的生命周期中怎么获取控件宽高?

onNewIntent的执行时机?

如何连续退出多个Activity?

如何把Acitivty设置成Dialog样式 ,android:theme="@android:style/ThemeDialog"

关于横竖屏切换的生命周期,对应不同的手机,由于厂商定制的原因,会有不同的效果,如设置了configChanges="orientation”在有些手机会执行各个生命周期,但有些手机却不会执行。

网上常见的结论如下:

但实际的测试如下:

可以看出,不同厂商的手机切屏生命周期会有差异。

从API 13以上,当设备在横竖切屏时,“屏幕尺寸”也会发生变化,因此为了杜绝切屏导致页面销毁重建,需要加上screenSize,使用设置4,即 android:configChanges="orientation|keyboardHidden|screenSize"

Activity的四种状态如下:

在activity处于paused或者stoped状态下,如果系统内存紧张,可能会被销毁,当重回该activity时会重建,正常返回和被回收后返回的生命周期如下:

如果是回收后返回,onCreate的参数savedInstanceState不为空。

有哪些场景会触发onNewIntent回调呢?跟启动模式有关,首先该Activity实例已经存在,再次启动才可能触发。一种情况是启动模式是singleTask或者singleInstance,无论该activity在栈中哪个位置,都会触发onNewIntent回调,并且把上面其他acitivity移除,另一种情况是启动模式是singleTop或者以FLAG_ACTIVITY_SINGLE_TOP启动,并且该activity实例在栈顶,会触发onNewIntent,如果不在栈顶是重新创建的,不会触发。

在实际业务开发中,往往碰到需要连续退出多个activity实例,下面整理了几种常见方法:

● 发送特定广播

1、在需要处理连续退出的activity注册该特定广播;

2、发起退出的activity发送该特定广播;

3、接收到该广播的activity 调用finish结束页面。

● 递归退出

1、用startActivityForResult启动新的activity;

2、前一个页面finish时,触发onActvityResult回调,再根据requestCode和resultCode处理是否finish,达到递归退出的效果。

● FLAG_ACTIVITY_CLEAR_TOP

通过intentsetFlag(IntentFLAG_ACTIVITY_CLEAR_TOP)启动新activity,如果栈中已经有该实例,则会把该activity之上的所有activity关闭,达到singleTop启动模式的效果。

● 自定义activity栈

1、自定义activity列表,新打开activity则加入栈中,关闭则移除栈;

2、需要退出多个activity时,则循环从栈中移除activity实例,并调用finish。

在讨论Activity启动模式经常提到任务栈,那到底什么是任务栈?

任务是一个Activity的集合,它使用栈的方式来管理其中的Activity,这个栈又被称为返回栈(back stack),栈中Activity的顺序就是按照它们被打开的顺序依次存放的。返回栈是一个典型的后进先出(last in, first out)的数据结构。下图通过时间线的方式非常清晰地向我们展示了多个Activity在返回栈当中的状态变化:

taskAffinity 任务相关性,可以用于指定一个Activity更加愿意依附于哪一个任务,在默认情况下,同一个应用程序中的所有Activity都具有相同的affinity, 名字为应用的包名。当然了,我们可以为每个 Activity 都单独指定 taskAffinity 属性(不与包名相同)。taskAffinity 属性主要和 singleTask 启动模式和 allowTaskReparenting 属性配对使用,在其他情况下没有意义。

taskAffinity 有下面两种应用场景:

分为显示启动和隐式启动。

(1)显示启动

直接指定待调整的Activity类名。

(2)隐式启动

Intent 能够匹配目标组件的 IntentFilter 中所设置的过滤信息,如果不匹配将无法启动目标 Activity。IntentFilter 的过滤信息有 action、category、data。

IntentFilter 需要注意的地方有以下:

● 一个 Activity 中可以有多个 intent-filter

● 一个 intent-filter 同时可以有多个 action、category、data

● 一个 Intent 只要能匹配任何一组 intent-filter 即可启动对应 Activity

● 新建的 Activity 必须加上以下这句,代表能够接收隐式调用

<category android:name="androidintentcategoryDEFAULT" />

只要匹配一个action即可跳转,注意的是action要区分大小写。

规则:如果intent中有category,则所有的都能匹配到intent-filter中的category,intent中的category数量可用少于intent-filter中的。另外,单独设置category是无法匹配activity的,因为category属性是一个执行Action的附加信息。

intent不添加category会匹配默认的,即 “android:intentcategoryDEFAULT”

如果上面例子,如果去掉intentsetAction("action_name"),则会抛出异常:

规则:类似action,但data有复杂的结构,只要匹配一个data并且与data中所有属性都一致就能匹配到Activity,只要有1个属性不匹配,都无法找到activity。

data的结构:

data 主要是由 URI 和 mimeType 组成的。

URI 可配置很多信息,的结构如下:

与url类似,例如:

mineType:指资源类型包括文本、、音视频等等,例如:text/plain、 image/jpeg、video/ 等

下面看下data匹配的例子:

只匹配scheme

只匹配scheme也是能匹配到activity的。

匹配scheme、host、port

将上面的data改为

匹配mineType

如果有mineType,则不能仅设置setData或setMineType了,因为setData会把mineType置为null,而setMineType会把data置为null,导致永远无法匹配到activity,要使用setDataAndType。

使用scheme的默认值content\file

注意该方法需要在startAtivity方法或者是finish方法调用之后立即执行,不能延迟,但可以在子线程执行。

而在windowAnimationStyle中存在四种动画:

activityOpenEnterAnimation // 打开新的Activity并进入新的Activity展示的动画

activityOpenExitAnimation // 打开新的Activity并销毁之前的Activity展示的动画

activityCloseEnterAnimation //关闭当前Activity进入上一个Activity展示的动画

activityCloseExitAnimation // 关闭当前Activity时展示的动画

overridePendingTransition的方式比较生硬,方法也比较老旧了,不适用于MD风格,google提供了新的转场动画ActivityOptions,并提供了兼容包ActivityOptionsCompat。

我们知道在onCreate和onResume里面直接获取到控件宽高为0,那有什么办法获取到控件的实际宽高?只要有onWindowFocusChanged、viewpost、ViewTreeObserver三种方式获取。

当用户点击桌面图标启动APP时,背后的流程如下:

我们看到的手机桌面是Launch程序的界面,点击应用图标会触发点击事件,调用startActivity(intent),然后通过Binder IPC机制,与ActivityManagerService(AMS)通讯,AMS执行一系列 *** 作,最终启动目前应用,大概流程如下:

通过PackageManager的resolveIntent()收集跳转intent对象的指向信息,然后通过grantUriPermissionLocked()方法来验证用户是否有足够的权限去调用该intent对象指向的Activity。如果有权限,则在新的task中启动目标activity,如果发现没有进程,则先创建进程。

如果进程不存在,AMS会调用startProcessLocked创建新的进程,在该方法中,会通过socket的通讯方式通知zygote进程孵化新的进程并返回pid,在新的进程中会初始化ActivityThread,并依次调用LooperprepareLoop()和Looperloop()来开启消息循环。

创建好进程后下一步要将Application和进程绑定起来,AMS会调用上一节创建的ActivityThread对象的bindAppliction方法完成绑定工作,该方法会发送一条BIND_APPLICATION的消息,最终会调用handleBindApplication方法处理消息,并调用makeApplication方法处理消息,加载APP的classes到内存中。

通过前面的步骤,系统已经拥有了该Application的进程,后续的启动则是从已存在其他进程中启动Acitivity,即调用realStartAcitvityLocked,该方法会调用Application的主线程对象ActivityThread的sheduleLaunchActivity方法,在方法中会发送LAUNCH_ACTIVITY到消息队列,最终通过handleLaunchActivity处理消息,完成Acitivty的启动。

Activity

Activity 的 36 大难点,你会几个?「建议收藏」

[译]Android Application启动流程分析

以上就是关于android activity跳转怎么传对象全部的内容,包括:android activity跳转怎么传对象、怎样实现android 返回到上一个Activity并重新执行一次onCreate方法、android 从一个activity跳转到另一个activity后在跳转回来,为什么就退出不了程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10199313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存