老套路看下效果图:

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

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

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

   /*** 监听Activity变化*/private void initActivityLifecycleCallbacks() {registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {//每次都添加activity到栈中ActivityManager.getInstance().addActivity(activity);Log.i("wsc", String.format("ActivityLifecycleCallbacks ---- onActivityCreated %s", activity.getLocalClassName()));}@Overridepublic 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()));}@Overridepublic void onActivityResumed(Activity activity) {Log.i("wsc", String.format("ActivityLifecycleCallbacks ---- onActivityResumed %s ", activity.getLocalClassName()));}@Overridepublic void onActivityPaused(Activity activity) {Log.i("wsc", String.format("ActivityLifecycleCallbacks ---- onActivityPaused %s ", activity.getLocalClassName()));}@Overridepublic 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()));}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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"><ProgressBarandroid: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" /><TextViewandroid: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" /><TextViewandroid: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页面添加自定义布局的源码:点击下载源码

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

  1. android开发出现No Launcher activity found!解决方案

    android开发出现No Launcher activity found!解决方案 参考文章: (1)android开发出现No Launcher activity found!解决方案 (2)ht ...

  2. Android开发——异步任务中Activity销毁时的问题

    0.  前言 在Android开发中经常会发生Activity的销毁重建,比如用户长时间接听一个电话后回到APP.在Android开发--Fragment知识整理(二)中我们提到了使用Fragment ...

  3. # android开发:4-1、Activity启动方式、生命周期、不同activity的数据传递

    4.Activity活动简介 什么是Activity: 如何创建Activity: Activity启动方式: Activity的生命周期: 不同Activity之间数据的传递: 什么是Activit ...

  4. Android开发详解之App升级程序一点通

    Android开发详解之App升级程序一点通 结束语 UpdateManager.java import java.io.File; import java.io.FileOutputStream; ...

  5. Android开发艺术探索之Activity篇总结

    本文内容来自<Android开发艺术探索>第一章,个人学习提炼总结,欢迎指正. 1.1典型情况下的生命周期 onCreate():表示Activity正在被创建,初始化布局资源+Activ ...

  6. activity销毁时执行执行方法是_[Android开发 VIII ]销毁一个activity

    销毁一个activity一共有两种方法,一种是按下返回键,就可以销毁当前activity:还有一种方法就是通过代码的方式,Android提供了finish()这个方法,调用这个方法也可以完成销毁一个a ...

  7. 云炬Android开发笔记 4单Activity界面架构设计与验证

    1.4-2本应用没有使用多个activity进行界面的展示,而是通过一个activity管理多个fragment来进行处理. fragment里面有很多坑,推荐使用开源库fragmentation. ...

  8. Android开发——创建新的activity

    1,主界面有一个Button按钮,点击之后进入计算器界面.主要目的是为了掌握,创建多个activity及之间的跳转. 2,首先在activity_main.xml文件中添加一个button.代码如下: ...

  9. Android开发艺术探索一 Activity

    一:生命周期: 典型情况:onCreate - onRestart - onStart - onResume - onPause - onStop - onDestory 1.按back键:onPau ...

最新文章

  1. CSS3的transform:将元素旋转,缩放,移动,倾斜
  2. 25岁,在一个需要工作的周末……
  3. python命令行工具_python命令行工具Click快速掌握
  4. php基础教程 第九步 自定义函数
  5. centos so查看_等保测评主机安全:CentOS密码修改周期与登录失败处理
  6. 湖州机器人上课时间_【倒计时5天】燃到炸!湖州吾悦广场10月30日开业狂欢指南,请收下...
  7. 【图像超分辨(SR)】通俗直观彻底理解双线性插值、双三次插值及其作用
  8. 微信打印实现过程和免费下载
  9. welearn综合教程网课答案
  10. 自用计算机一套送东西,购买笔记本电脑别忘记索要赠品
  11. 【基因芯片】差异表达分析的基本原理与方法
  12. 2020软件测试自学全套教程-基于python自动化软件测试-2020新版软件测试中级程序员学习路线
  13. 【转载】让盐和味精告诉你,「变量」是什么 | 亲子课堂 第 4 课
  14. 华为鸿蒙系统nova5i,华为nova 5i评测:极点全面屏+后置2400万AI四摄 让美更进一步...
  15. php几点几面向对象,寸草不生的周六-PHP之面向对象(三)
  16. pythonwith open 打开多个文件_Python中使用with语句同时打开多个文件
  17. java工作中好用的方法
  18. Python 实现摄像头功能
  19. 堆栈概念(来自维基)
  20. 蓄电池与超级电容混合储能并网matlab/simulink仿真模型,混合储能采用低通滤波器进行功率分配,可有效抑制功率波动

热门文章

  1. defunct 进程占用端口_UAV心跳机制与容器、进程数据采集
  2. mysql周报内容范文_Mysql各种表格查询含实例,日报,周报,月报,时间差自动计算...
  3. wingdows安装psutil_python 第一步
  4. java怎么获取传入路径_java如何获取jsp页面上传的文件路径
  5. python异常处理优点_python各类异常处理学习笔记
  6. php如何水平对齐所有星星,css怎么设置水平对齐
  7. linux rpm 修复,记录一下修复yum及rpm的过程
  8. python自动化开发_python自动化开发-2
  9. java面向对象-------类属性和方法,不同类之间调用
  10. 设计把所有的奇数移动到所有偶数前面的算法