精华内容
参与话题
问答
  • StartActivity的2种用法

    万次阅读 2019-03-12 15:50:24
    startActivity有2种用法 1.显示调用。通过指明ComponentName,显示调用Activity,若 Intent intent = newIntent(CustomerService.this, DetailInfo.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ...

    startActivity有2种用法

    1.显示调用。通过指明ComponentName,显示调用Activity,若

    Intent intent = newIntent(CustomerService.this, DetailInfo.class);

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    mContext.startActivity(intent);

    这种用法需要注意的是在AndroidManifest.xml声明一下Activity,

    否则将报throws if therewas no Activity found to run the given Inten

    <activity android:name=“CustomerService”

    android:launchMode=“singleTask”

    android:exported=“true”>

    categoryandroid:name=“android.intent.category.LAUNCHER”/

    2.隐式调用,只需要指明ACTION就可以了,若

    Intent intent = newIntent(“com.android.customerservice.ACTION”);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    mContext.startActivity(intent);

    这种用法在AndroidManifest.xml声明Activity需要在intent-filter中添加该ACTION

    <activity android:name=“CustomerService”

    android:launchMode=“singleTask” android:exported=“true”>

    categoryandroid:name=“android.intent.category.LAUNCHER”/

    actionandroid:name=“com.android.customerservice.ACTION”/

    categoryandroid:name=“android.intent.category.DEFAULT”/

    需要注意的是,自定义的ACTION不能加在android.intent.action.MAIN所在的intent-filter中,必须添加在一个新的intent-filter中,同时必须设置categoryandroid:name="android.intent.category.DEFAULT,

    否则将报throws if therewas no Activity found to run the given Inten

    展开全文
  • startActivity&startActivities有什么不同?

    千次阅读 2018-10-22 22:10:51
    平时用startActivity用习惯了,当别人问你startActivities是什么意思时,你会不假思索的说,可能是同时启动多个activity吧,这简直就是一道送命题啊,验证之后才发现不是想象中那么简单。 准备三个ActivityA,...

    问题

    平时用startActivity用习惯了,当别人问你startActivities是什么意思时,你会不假思索的说,可能是同时启动多个activity吧,这简直就是一道送命题啊,验证之后才发现不是想象中那么简单。

    准备三个ActivityA,ActivityB,ActivityC:

    准备代码:

        fun multiIntent(view : View) {
            val intent_1   = Intent(this,IntentActivityA::class.java)
            val intent_2   = Intent(this,IntentActivityB::class.java)
            val intent_3   = Intent(this,IntentActivityC::class.java)
            
            startActivities(arrayOf(intent_1,intent_2,intent_3))
        }
    
    

    结果展示为:
    在这里插入图片描述

    可以看到,先展示是ActivityC,然后是ActivityB,最后是ActivityA,那么情况是不是这样的:我startActivities时,ActivityA、ActivityB和ActivityC都被创建了,只是依次压入栈底了,我finish掉ActivityC,清除了栈顶,然后ActivityB就可见了,清除ActivityB之后,ActivityA就到栈顶了。
    还是另外一种情况:先创建了ActivityC,等到ActivityC finish掉之后,再开始创建ActivityB,等到ActivityB finish掉之后,再创建ActivityA呢?我们先打一波log看看:

     IntentActivity C onCreate
     IntentActivity B onCreate
     IntentActivity C onDestroy
     IntentActivity A onCreate
     IntentActivity B onDestroy
     IntentActivity A onDestroy
    

    通过log我们发现,startActivities的逻辑是我们的方式二,是单个Activity创建的,创建完成之后,等到Activity finish之后再创建剩余的Activity;并不是我们想象的一口气创建统统压入栈中的。

    应用

    说了这么多,你会不会感觉这个玩意没什么卵用,因为这样的需求我遇见的不多。的确,这个方法我以前是不知道的,也从来没用过,但是最近遇到了这样的问题,先截取一下开源中国说明一下:
    在这里插入图片描述
    这个程序的主要问题在哪里呢?他点击了广告详情进入目标页面之后,然后点击返回,并没有像我们想象的一样直接返回主界面,而是整个程序都退出了,然后再延迟进入主界面的,这样的操作给人感觉不是很好的(我不否认开源中国这个app写得很好,我也学习了不少好东西),因为我们项目中也出现了这个问题,流程图大概是这样的:

    每家的app逻辑都不太一样,我们这样是首页出现广告页面(与开源中国OSC中一样的显示),然后你点击进去可以买东西,买了直接进入主界面MainActivity。当初我们的做法比较辣鸡,伪代码如下:

    # ProductDetailActivity 中
    # 返回按钮和后退按钮共用同一个方法
    public void onBackPress() {
    	if(isFromSplashPage) {   //如果是从来Splash页面来的,那么这里就需要返回到主界面
    		MainActivity.start(this);
    		finish();
    	}else {		//其他页面可以进入产品详情页面,此时直接退出页面即可
    		finish();
    }
    

    这样的做法不是不可以,但是意识到startActiitives的作用之后,那就不用传入isFromSplashPage参数了,直接这样就可以:

    # SplashActivity 页面
    var intent_main = Intent(this, MainActivity::class.java) 
    var intent_product = Intent(this, ProductDetailActivity::class.java)
    startActivities(arrayOf(intent_main, intent_product))
    

    这还不是重点,重点是发现了我发现了我们的产品推送时,也可以使用这样的逻辑:

    如果你登录成功了,那么我直接可以让你看推送详情页面,否则直接让你登录,伪代码可以如下:

    // PushUtils:
    if(userHasLogin) {
    	var intent_detail = Intent(this, PushDetailActivity::class.java)
    	var intent_main   = Intent(this,MainActivity::class.java)
    	startActivitied(arrayOf(intent_detail, intent_main))
    }else {
    	startActivity(Intent(this,LoginActivity::class.java))
    }
    
    //LoginActivity
    if(LoginSuccess) {
    	var intent_detail   = Intent(this, PushDetailActivity::class.java)
    	var intent_main     = Intent(this,MainActivity::class.java)
    	startActivitied(arrayOf(intent_detail, intent_main))
    }else{
    	var intent_main = Intent(this,MainActivity::class.java)
    	startActivity(intent_main)
    	finish()
    }
    

    好了,也算自己的一个总结吧,下次遇到这种问题时,就知道该怎么写了。

    展开全文
  • startActivityForResult与startActivity的不同之处在于: 1、startActivity( ) 仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。 2、startActivityForResult( ) 可以一次性完成这...

    startActivityForResult与startActivity的不同之处在于:
    1、startActivity( )
    仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
    2、startActivityForResult( )
    可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。

    相关函数:
    startActivityForResult(Intent intent, Int requestCode)
    setResut(int resultCode, Intent intent)
    onActivityResult(int requestCode, int resultCode, Intent intent)

    简单例子介绍:

    1.跳转的时候不是采用startActivity(intent) 这个方法,而是startActivityForResult(intent, 0)

    Intent intent=new Intent();
    intent.setClass(A.this, B.class);
    Bundle bundle=new Bundle();
    String str1=”aaaaaa”;
    bundle.putString(“str1”, str1);
    intent.putExtras(bundle);
    startActivityForResult(intent, 0);//这里采用startActivityForResult来做跳转,此处的0为一个依据,可以写其他的值,但一定要>=0

    2.重写onActivityResult方法,用来接收B回传的数据。

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK
    case RESULT_OK:
    Bundle b=data.getExtras(); //data为B中回传的Intent
    String str=b.getString(“str1”);//str即为回传的值
    break;
    default:
    break;
    }
    }

    3.在B中回传数据时采用setResult方法,并且之后要调用finish方法。

    setResult(RESULT_OK, intent); //intent为A传来的带有Bundle的intent,当然也可以自己定义新的Bundle
    finish();//此处一定要调用finish()方法

    Android activity的setResult()在什么时候调用(重点也是难点)

    如果在startActivityForResult起来的Activity里面设置setResult,结果并不会马上返回给parent的Activity,只有当前Activity被finish,结果才会被发送给parent的onActivityResult去处理!

    如果一个activity要返回数据到启动它的那个activity,可以调用setResult()方法。那什么时候去调用setResult()方法返回数据呢?

    public final void setResult(int resultCode, Intent data) {
    synchronized (this) {
    mResultCode = resultCode;
    mResultData = data;
    }
    }

    public void finish() {
        if (mParent == null) {
            int resultCode;
            Intent resultData;
            synchronized (this) {
                resultCode = mResultCode;
                resultData = mResultData;
            }
            if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
            try {
                if (ActivityManagerNative.getDefault()
                    .finishActivity(mToken, resultCode, resultData)) {
                    mFinished = true;
                }
            } catch (RemoteException e) {
                // Empty
            }
        } else {
            mParent.finishFromChild(this);
        }
    }
    

    这段代码可以看出activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。
    那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
    因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的

    按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,然后设置resultCode为RESULT_CANCELED,也就不会返回任何数据了 .
    解决方法就是在Activity里面捕获按BACK的事件,捕获到之后先setResult,然后自己来调用finish,就搞定了……把BACK事件直接自己给吞了

    @Override
    public void onBackPressed() {
    Log.i(TAG, “onBackPressed”);
    setResult(Const.LIVE_OK);
    super.onBackPressed();
    }

    当然还可以在onCreate()就调用setResult,不过我觉得这种方法没有重写onBackPressed()方法好.

    展开全文
  • 1,startActivity主要用于发起一个新的Activity 2,startActivityForResult,在发起一个新的Activity的同时,希望发起的Acitivity返回一个当前Activity需要的结果。这个方法需要搭配setResult和重写Activity的...

    1,startActivity主要用于发起一个新的Activity

    2,startActivityForResult,在发起一个新的Activity的同时,希望发起的Acitivity返回一个当前Activity需要的结果。这个方法需要搭配setResult和重写Activity的onActivityResult来实现完整的结果返回

    展开全文
  • 先看下 Context.java 中...public abstract void startActivity(@RequiresPermission Intent intent); /** * Launch a new activity. You will not receive any information about when * the activity exits. ...
  • startActivity()详解

    万次阅读 2018-08-02 11:43:51
    startActivity()详解 class ReceiverRestrictedContext extends ContextWrapper { ReceiverRestrictedContext(Context base) { super(base); } } final Context getReceiverRestrictedContext...
  • Activity的启动流程简述

    万次阅读 2019-04-21 00:25:06
    在Activity 中发起 =====>...public void startActivity(Intent intent, @Nullable Bundle options) { if (options != null) { startActivityForResult(intent, -1, options); } else { ...
  • startActivity(receiver); /** * 连接wifi */ // connectedWifi(this); /** * 登入控制界面 */ loginInfo = (TextView) findViewById(R.id.loginInfo); login.setOnClickListener(new View....
  • 用于指定Activity被启动的方式,主要包括两个方面:即Activity是否为单实例,及Activity归属的task。不管是那种方式,被启动的Activity都要位于Activitytask的栈顶。 1),standard,默认状态,这种模式下Activity是...
  • 基于Android 6.0的源码剖析, 分析android Activity启动流程,相关源码: frameworks/base/services/core/java/com/android/server/am/ - ActivityManagerService.java - ActivityStackSupervisor.java - ...
  • 上文介绍了Android应用程序的启动过程,即应用程序默认Activity的启动过程,一般来说,这种默认Activity是在新的进程和任务中启动的;本文将继续分析在应用程序内部启动非默认Activity的过程的源代码,这种非默认...
  • Android插件化开发之Hook StartActivity方法

    万次阅读 热门讨论 2016-11-18 00:22:53
    第一步、先爆项目demo照片,代码不多,不要怕 第二步、应该知道Java反射相关知识 如果不知道或者忘记的小伙伴请猛搓这里,Android插件... 第三步、应该知道Java静态代理知识 如果不知道或者忘记的小伙伴请猛搓这
  • 我们以 startActivity(Intent) 这个最常用的 api 来讲。 1. 首先,Context 类有一个 abstract 方法 /** * Same as {@link #startActivity(Intent, Bundle)} with no options * specified. * * @param ...
  • Android startActivity源码详解

    千次阅读 2016-03-23 13:08:31
    在Android页面跳转的时候,我们一般都会调用
  • 非Activity环境startActivity的正确姿势

    千次阅读 2019-05-28 22:07:49
    对于Android7.0~8.1系统,调用`startActivity(Intent intent)`可以不用加标记,调用startActivity(Intent intent, Bundle options)时,options有值则需注意加标记或为options添加上指定的LaunchTaskId。
  • 本文基于api 24,Activity的启动过程之startActivity源码解析
  • Android进阶之路系列:http://blog.csdn.net/column/details/16488.html在activity中intent到底是怎么传递的,而且还可以跨进程甚至跨app来传递,下面我们从源码层面探索一下从startActivity开始,源码如下:@...
  • 我们特别熟悉当Activity需要跳转到另外一个Activity的时候,直接用startActivity就可以了,那么这句代码的背后涉及到什么,本篇将梳理一遍Activity的启动过程,但是由于源码篇幅过多,也比较复杂。没办法一一去解析...
  • 原文链接:... 1. 首先,Context 类有一个 abstract 方法 /** * Same as {@link #startActivity(Intent, Bundle)} with no options * specified. * ...
  • android startActivity 过慢

    2015-09-15 02:23:19
    在service的startActivity(intent)之前也打了log Log.i("1234", "realstart"+System.currentTimeMillis()); startActivity(it); 结果俩个log中间耗时超过3-4s,仅当回到桌面后按home键 或者进入别...
  • Android 10 startActivity 源码分析

    千次阅读 2020-04-06 17:21:04
    此图着重提炼了生命周期的部分,Android 10 中 新增了 ActivityTaskManager ,专门用于管理 Activity,接替了 ActivityManager 的一部分工作 理解 Instrumentation Activity 首先会通过 Instrumentation 去调用,...
  • 相信Android开发都遇到过...04-09 15:55:08.165: E/AndroidRuntime(3403): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_T...
  • Android startActivity中的Intent的各种FLAG

    千次阅读 2017-03-22 15:33:33
    Android中发送Intent的时候有很多的标志位可以使用。是在做各种各样UI跳转时,熟悉这些标志的作用会给开发过程带来很大的遍历,这几天找时间把这些Flag都看了一遍,顺便翻译了一下,为便于理解,在翻译的时候也加了...
  • startActivity兼容性问题总结 最近事情比较多,也遇到了很多坑,特别是最近android不同手机跳转scheme兼容性问题,在测试中发现android 6.0.1以下的手机不可以正常跳转,7.0-8.0的系统可以正常跳转,9.0的系统又无法...
  • 沙翁 向昨天要经验;...startActivity时报错Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag 原代码如下: Intent intent = new Intent()
  • 以下这段代码,运行程序,按下返回键或者最近任务键均会直接启动Camera,但是若是按下HOME键,则会延迟n(n>5)秒才会启动Camera,为什么呢?有什么办法让它快速启动呢?... startActivity(i); } }
  • 一、startActivity( ) 与startActivityForResult( )的区别 1、startActivity( )  startActivity( ) 仅仅是启动另一个Activity,他不会自定回转到原来的Activity,若是想跳回原来的页面,则必须再使用一次start...
  • startActivity时报错Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag 问题代码: Intent intent = new Intent(); intent.setClass(mContext, PhotoView....
  • 第一种方法请看http://blog.csdn.net/x605940745/article/details/9902895 Intent intent=new Intent(); intent.setClass(MainActivity.this, SecondActivity.class); MainActi
  • 相信Android开发都遇到...04-09 15:55:08.165: E/AndroidRuntime(3403): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TAS...

空空如也

1 2 3 4 5 ... 20
收藏数 921,615
精华内容 368,646
关键字:

startactivity