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