100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Android开发之在任意Activity在广点通页面添加自定义布局在穿山甲页面添加任意布局

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

时间:2021-04-27 14:33:32

相关推荐

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

老套路看下效果图:

上面是穿山甲的广告页面,需求是添加自定义布局到别人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 .manager;import android.app.Activity;import android.util.Log;import java.util.Stack;/*** @author 刘畅* @createdate -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="/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页面添加自定义布局的源码:点击下载源码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。