App A 唤起 App B 并传参,AppB在登录之后的页面,无论哪个页面都有一个弹窗。点击确定按钮,唤起App A (传参)

白昼怎懂夜的黑 提交于 2020-03-06 18:04:17

一 .需求:App A 唤起并传参给 App B ,AppB在登录之后的页面,无论哪个页面都有一个弹窗。点击确定按钮,唤起并传参给App A 

二.思路:

a:App B 创建一个Activity  S.专门用来接收参数,接收到了并存在本地(唤起的接收参数:根据要跳的Activity,或者根据包名,在启动页的Activity 接收到参数)。

(1):没有登陆过,跳转引导页(请求域名,然后根据状态跳到对应页面)。

(2):登录过的话分为两种情况。

          (2-1):App B 是关闭程序状态唤起,同(1)操作。

           (2-2):App B 是后台状态唤起,就直接 finish(). 当前页面  Activity S。 -->上次进入后台什么页面,这次唤起就什么页面。

          (2-3):后台唤起的判断(默认域名是错的地址,并且 public static 状态保存,如果之前没有完全杀死App B,那么这个值还存在):

!StringUtil.isEmpty(当前域名) && !当前域名.equals("默认的错误域名")

b:App A  AppB

(1)启动模式都是  singletask(弹出其他Activity,自己处于栈顶).

(2)都是竖屏 screenorientation="potraint". (如果App A 横屏,App B 根据自己需求决定横竖屏)

(3)传值唤起(采用包名+Activity名):(三种方式,根据包名,根据包名+activity名,根绝Url配置)

       

                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.setComponent(new ComponentName("包名","Activity名"));
                intent.putExtra("参数Key","参数值");
                startActivity(intent);

c:接收参数

(1)未登录情况进去首页,那么在首页数据请求好之后,获取本地存储的状态,来展示弹窗框

(2)后台进入:

         a:在基类的BaseActivity 写一个方法可以展示Dialog(项目相同方法最好封装一下,方便改动),一个内部类来处理,用户点击“确定”按钮的操作,比如:写唤起 App A 并且传参数。注意:在唤起其他App,做个判断,是否这个包名存在,不存在就Toast提示用户,被唤起的App A 没有安装在本机。防止找不到App A,AppB 奔了。

         b:添加一个ActivityManager 管理Activity.可以获取堆栈 Activity 的信息。在BaseActivity OnCreate的时候,进栈。在onDestory的时候 移除这个Activity. 

         c:Applicaton 实现 接口 ActivityLifecycleCallbacks。在onActivityCrceated 的时候 ,将activity 转成 BaseActivity,做了容错判断,防止使用引用第三方的项目,执行这个方法,转化 失败,笨了。

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        LogUitl.e("===========================appli=======顺序前后=======onActivityCreated---此处记录最后的activity"+activity.getPackageName()+","+activity.getClass().getSimpleName());
        // 此处记录最后的activity
        try {
            mActivity = (BaseActivity) activity;
        }catch (Exception e){
            mActivity=null;
        }
    }
public static BaseActivity mActivity = null;
    /**
     *公开方法,外部可通过 MyApplication.getInstance().getCurrentActivity() 获取到当前最上层的activity
     */
    public static BaseActivity getCurrentActivity() {
        return mActivity;
    }

d:应用切换到前台:

(1)获取当前最顶部的Activity ,判断是否是 Activity S 。如果 是的话,就是App A唤起App B 的操作,然后获取栈的第二个activity.后台进去前台,堆栈的Activity >=2.

(2)获取本地在Activity S 存的数据。如果这个值不是空的,那么进行查询得到数值,再被用户点击的时候唤起App A.

三 参考资料:

a:唤起

1.https://blog.csdn.net/margin_0px/article/details/87928709  --  使用这个  ---取值
2.https://blog.csdn.net/qq_43668086/article/details/87858865  --  使用这个  ---传值

b:启动模式

1.https://blog.csdn.net/elisonx/article/details/80397519

c:前后端切换

https://blog.csdn.net/qq_37451521/article/details/86479619

d:Activity管理类

https://www.jianshu.com/p/18552ac1fceb

四:部分工具代码--网络找的,地址出处就在三的链接:

a:ActivityManager

package xxxxx;

import android.app.Activity;
import xxxxx;
import java.util.Stack;

/**
 * https://www.jianshu.com/p/18552ac1fceb
 */
public class ActivityManager {
    private static ActivityManager instance;
    private Stack<Activity> activityStack;// activity栈

    // 单例模式
    public static ActivityManager getInstance() {
        if (instance == null) {
            instance = new ActivityManager();
        }
        return instance;
    }

    // 把一个activity压入栈中
    public void pushOneActivity(Activity actvity) {
        if (activityStack == null) {
            activityStack = new Stack<Activity>();
        }
        activityStack.add(actvity);
    }

    // 获取栈顶的activity,先进后出原则
    public Activity getLastActivity() {
//        activityStack.remove(activityStack.size()-1);
        activityStack.get(activityStack.size()-1);
        return activityStack.lastElement();
    }

//    public Activity getLastTowActivity() {
//        return activityStack.get(activityStack.size()-1);
//    }

    // 移除一个activity
    public void popOneActivity(Activity activity) {
        if (activityStack != null && activityStack.size() > 0) {
            if (activity != null) {
                activity.finish();
                activityStack.remove(activity);
                activity = null;
            }
        }
    }

    // 退出所有activity
    public void finishAllActivity() {
        if (activityStack != null) {
            while (activityStack.size() > 0) {
                Activity activity = getLastActivity();
                if (activity == null)
                    break;
                popOneActivity(activity);
            }
        }
    }

    /**
     * 堆栈循环得到对应activity名称
     * @return
     */
    public int aaa(){
        if (activityStack != null) {
            for(int i=0;i<activityStack.size();i++){
                activityStack.get(i).getClass().getSimpleName();
                LogUitl.e("======================到前台=============appli=======顺序前后=======aaa====="+i+","+activityStack.get(i).getClass().getSimpleName());
            }
        }
        return activityStack.size();
    }

    /**
     * 栈顶第二个
     * @return
     */
    public Activity getLastTow(){
        if (activityStack != null && activityStack.size()>1) {
            return  activityStack.get(activityStack.size()-2);
        }
        return null;
    }

//    public String getLastTowSimeName(){
//        if (activityStack != null && activityStack.size()>2) {
//            return  activityStack.get(activityStack.size()-2).getClass().getSimpleName();
//        }
//        return "";
//    }
//
//    public boolean ifHaveActivity(Activity actvity){
//        if (activityStack != null && activityStack.contains(actvity)) {
//            return true;
//        }
//        return false;
//    }
//
//    public boolean iFHaveActivity(String compareName){
//        if (activityStack != null && !StringUtil.isEmpty(compareName)) {
//            for(int i=0;i<activityStack.size();i++){
//                if(compareName.equals(activityStack.get(i).getClass().getSimpleName().trim())){
//                    return true;
//                }
//            }
//        }
//        return false;
//    }

}

b:AppFrontBackHelper

package xxxx.util;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;

/**
 * 前后端切换
 * https://blog.csdn.net/qq_37451521/article/details/86479619
 */
public class AppFrontBackHelper {
    private OnAppStatusListener mOnAppStatusListener;

    public AppFrontBackHelper() {

    }

    /**
     * 注册状态监听,仅在Application中使用
     * @param application
     * @param listener
     */
    public void register(Application application, OnAppStatusListener listener){
        mOnAppStatusListener = listener;
        application.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
    }

    public void unRegister(Application application){
        application.unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);
    }

    private Application.ActivityLifecycleCallbacks activityLifecycleCallbacks = new Application.ActivityLifecycleCallbacks() {
        //打开的Activity数量统计
        private int activityStartCount = 0;

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

        }

        @Override
        public void onActivityStarted(Activity activity) {
            activityStartCount++;
            //数值从0变到1说明是从后台切到前台
            if (activityStartCount == 1){
                //从后台切到前台
                if(mOnAppStatusListener != null){
                    mOnAppStatusListener.onFront();
                }
            }
        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {

        }

        @Override
        public void onActivityStopped(Activity activity) {
            activityStartCount--;
            //数值从1到0说明是从前台切到后台
            if (activityStartCount == 0){
                //从前台切到后台
                if(mOnAppStatusListener != null){
                    mOnAppStatusListener.onBack();
                }
            }
        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

        }

        @Override
        public void onActivityDestroyed(Activity activity) {

        }
    };

    public interface OnAppStatusListener{
        void onFront();
        void onBack();
    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!