老套路看下效果图:
上面是穿山甲的广告页面,需求是添加自定义布局到别人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页面添加自定义布局的源码:点击下载源码
