Android开发之在任意Activity在广点通页面添加自定义布局在穿山甲页面添加任意布局

老套路看下效果图:

上面是穿山甲的广告页面,需求是添加自定义布局到别人SDK的页面,SDK内部不支持这样方式。怎么办呢?

思路:实际上我们可以换位思考下,如果能拿到这个广告页的activity页面,在这个拿到的activity页面添加自定义布局不就好了。

看下如何获取当前activty:下面这个方法要在application中初始化

   /**
     * 监听Activity变化
     */
    private void initActivityLifecycleCallbacks() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                //每次都添加activity到栈中
                ActivityManager.getInstance().addActivity(activity);
                Log.i("wsc", String.format("ActivityLifecycleCallbacks ---- onActivityCreated %s", activity.getLocalClassName()));
            }

            @Override
            public void onActivityStarted(Activity activity) {
                if (activityCount == 0) {
                    ActivityManager.getInstance().setAppInBackGround(false);
                    Log.i("wsc", String.format("ActivityLifecycleCallbacks ---- onActivityStarted 回到前台 %s ", activity.getLocalClassName()));
                    AppRecordUtils.getInstance().startRecord();
                }
                activityCount++;

                Log.i("wsc", String.format("ActivityLifecycleCallbacks ---- onActivityStarted %s ", activity.getLocalClassName()));


            }

            @Override
            public void onActivityResumed(Activity activity) {
                Log.i("wsc", String.format("ActivityLifecycleCallbacks ---- onActivityResumed %s ", activity.getLocalClassName()));


            }

            @Override
            public void onActivityPaused(Activity activity) {
                Log.i("wsc", String.format("ActivityLifecycleCallbacks ---- onActivityPaused %s ", activity.getLocalClassName()));

            }

            @Override
            public void onActivityStopped(Activity activity) {
                activityCount--;
                if (activityCount == 0) {
                    ActivityManager.getInstance().setAppInBackGround(true);
                    Log.i("wsc", String.format("ActivityLifecycleCallbacks ---- onActivityStopped app 在后台运行%s ", activity.getLocalClassName()));
                    AppRecordUtils.getInstance().stopRecord();
                }

                Log.i("wsc", String.format("ActivityLifecycleCallbacks ---- onActivityStopped %s ", activity.getLocalClassName()));

            }

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

            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                ActivityManager.getInstance().removeActivity(activity);
                Log.i("wsc", String.format("ActivityLifecycleCallbacks ---- onActivityDestroyed %s ", activity.getLocalClassName()));

            }
        });
    }

看下自己写ActivityManager

package cn.xiayiye5.com.manager;

import android.app.Activity;
import android.util.Log;

import java.util.Stack;


/**
 * @author 刘畅
 * @createdate 2019-06-18
 * @describe
 */
public class ActivityManager {

    private Stack<Activity> mStack;

    private boolean appInBackGround;

    public boolean isAppInBackGround() {
        return appInBackGround;
    }

    public void setAppInBackGround(boolean appInBackGround) {
        this.appInBackGround = appInBackGround;
    }

    private ActivityManager() {
        if(mStack == null){
            mStack = new Stack<>();
        }
    }

    private static final class SingletonHolder {
        private static final ActivityManager INSTANCE = new ActivityManager();
    }

    public static final ActivityManager getInstance() {
        return SingletonHolder.INSTANCE;
    }

    public void addActivity(Activity activity){
        if(activity != null){
            mStack.add(activity);
        }
        Log.i("wsc",String.format("ActivityManager addActivity = %s %s ",activity.getLocalClassName(),mStack.size()));


    }
    public void removeActivity(Activity activity){
        if(activity != null){
            mStack.remove(activity);
        }
        Log.i("wsc",String.format("ActivityManager removeActivity = %s %s ",activity.getLocalClassName(),mStack.size()));
    }

    public void finishActivity(Activity activity){
        if(activity != null){
            removeActivity(activity);
            if(!activity.isFinishing()){
                activity.finish();
            }
        }
    }

    /**
     * 该方法慎用 容易引起内存泄漏
     * @return
     */
    public Activity getCurrentActivity(){
        Activity activity = null;
        if (!mStack.empty()){
            activity = mStack.lastElement();
        }
        return activity;

    }

    public int getStackSize(){
        return mStack.size();
    }
    public Activity getStackActivity(int index){
        if (index < 0){
            return null;
        }
        if(mStack.size() > index){
            return mStack.get(index);
        }
        return null;
    }


    public Activity getStackActivityDesc(int index){
        if(mStack.size() > index){
            return mStack.get(mStack.size() - 1 - index);
        }
        return null;
    }


    /**
     * 弹出除cls外的所有activity
     *
     * @param cls
     */
    public void finishAllActivityWithOut(Class<? extends Activity> cls) {
        while (true) {
            Activity activity = getCurrentActivity();
            if (activity == null) {
                break;
            }
            if (activity.getClass().equals(cls)) {
                break;
            }
            removeActivity(activity);
        }
    }

    /**
     *  关闭activity
     * @param count 关闭的数量
     */
    public void finishActivityCount(int count){
        for (int i = 0; i < count; i++) {
            Activity activity = getCurrentActivity();
            finishActivity(activity);
        }
    }

    /**
     * 关闭指定Activity
     * @param clazz Activity类
     */
    public void finishActivity(Class<? extends Activity> clazz){
        for (int i = 0; i < mStack.size(); i++) {
            if(mStack.get(i).getClass().equals(clazz)){
                finishActivity(mStack.get(i));
                break;
            }
        }
    }

    /**
     * 堆栈里是否有这个页面
     * @param clazz
     * @return
     */
    public boolean hasActivity(Class<? extends Activity> clazz){
        for (int i = 0; i < mStack.size(); i++) {
            if(mStack.get(i).getClass().equals(clazz)){
                return true;
            }
        }
        return false;
    }



    /**
     * 关闭这个Activity之前的页面
     * @param cls Activity类
     */
    public void finishActivityWithOut(Class<? extends Activity> cls){
        while (!mStack.empty()) {
            Activity activity = getCurrentActivity();
            if (activity.getClass().equals(cls)) {
                break;
            } else {
                finishActivity(activity);
            }
        }
    }

    /**
     * 结束除cls之外的所有activity,执行结果都会清空Stack
     *
     * @param cls
     */
    public void finishAllActivityExceptOne(Class<? extends Activity> cls) {
        while (!mStack.empty()) {
            Activity activity = getCurrentActivity();
            if (activity.getClass().equals(cls)) {
                removeActivity(activity);
            } else {
                finishActivity(activity);
            }
        }
    }

    /**
     * 结束所有activity
     */
    public void finishAllActivity() {
        while (!mStack.empty()) {
            Activity activity = getCurrentActivity();
            finishActivity(activity);
        }
    }
}

将自定义布局添加到activity的方法:

 new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    Log.i("kk", ActivityManager.getInstance().getCurrentActivity().getComponentName().getClassName() + "pppp");
                    addViewToContent(ActivityManager.getInstance().getCurrentActivity());
                }
            }, 300);
    public void addViewToContent(final Activity activity) {
        if (activity == null) {
            return;
        }

        activity.getWindow().getDecorView().post(new Runnable() {
            @Override
            public void run() {
                FrameLayout frameLayout = (FrameLayout) activity.findViewById(Window.ID_ANDROID_CONTENT);
                View addView = View.inflate(activity, R.layout.ad_page_add_view, null);
                FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
                        FrameLayout.LayoutParams.WRAP_CONTENT,
                        RelativeLayout.LayoutParams.WRAP_CONTENT,
                        Gravity.RIGHT);
                layoutParams.topMargin = CommonUtil.dip2px(activity,80);
                addView.setLayoutParams(layoutParams);
                frameLayout.addView(addView);
            }
        });
    }

看下xml布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tvStoneGive"
    android:layout_width="110dp"
    android:layout_height="@dimen/dp_45"
    android:background="@drawable/shape_stone_bg"
    android:orientation="vertical">

    <ProgressBar
        android:id="@+id/pbPlayProgress"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="@dimen/dp_67"
        android:layout_height="3dp"
        android:layout_marginLeft="@dimen/dp_15"
        android:layout_marginTop="@dimen/dp_14"
        android:layout_marginRight="@dimen/dp_2"
        android:max="100"
        android:progress="30"
        android:progressDrawable="@drawable/get_gift_progress" />

    <TextView
        android:id="@+id/tvShowProgress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/dp_9"
        android:layout_marginRight="@dimen/dp_4"
        android:layout_toRightOf="@id/pbPlayProgress"
        android:text="3/10"
        android:textColor="@color/color_black_333333"
        android:textSize="9sp" />

    <TextView
        android:id="@+id/tvShowGift"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/pbPlayProgress"
        android:layout_marginLeft="@dimen/dp_17"
        android:layout_marginTop="@dimen/dp_6"
        android:layout_marginBottom="@dimen/dp_5"
        android:drawableLeft="@mipmap/icon_stone_game_detail"
        android:drawablePadding="5dp"
        android:text="+5原力/1天"
        android:textColor="@color/color_black_333333"
        android:textSize="10sp" />
</RelativeLayout>

参考布局说明:博主直达

如果需要源码请自行下载即可:

穿山甲SDK页面添加自定义布局的源码:点击下载源码

猜你喜欢

转载自blog.csdn.net/xiayiye5/article/details/108402022
今日推荐