SDK에서 Activity를 부드럽게 닫는 안드로이드
6682 단어 프로젝트 관련
블로거들이 최근 사업화 관련 작업을 계속하고 있어 사내 모든 프로젝트에 사용할 광고SDK를 써야 하기 때문이다.광고 SDK 내부에 몇 개의 광고 플랫폼을 통합한 SDK가 필요하기 때문에 많은 제3자 SDK와 접촉하는 것을 피할 수 없다.
그러나 제3자 광고 SDK가 제공하는 인터페이스는 항상 우리 제품의 수요를 만족시킬 수 없기 때문에 우리는 여러 가지 기괴한 방법을 생각해야 한다.이 문장의 출현도 우리가 전에 만났던 문제 때문에 일어난 것이다.
1. 수요는 다음과 같다.
우리는 Admob 플러그인 광고를 표시해야 하는 광고 위치가 하나 있는데 플러그인 광고의 인터페이스는 매우 간단하다. 요약하면 기본적으로 하나의load(), 하나의show() 방법이다.플러그인 광고는 네이티브 광고와 달리 네이티브 광고는 우리가 광고 자료를 얻고 뷰를 조립할 수 있다.그러나 플러그인 광고는 show() 방법을 호출하면 Admob 자체의 Activity 디스플레이 광고를 직접 시작합니다.그러나 우리가 광고를 클릭한 후에 이 액티비티가 사라지지 않는다는 것을 발견하면 매우 좋지 않은 체험을 하게 된다.정상적으로 우리는 광고가 GP를 뛰어넘거나 브라우저를 클릭하면 광고 페이지도 사라지기를 희망한다.이렇게 하면 사용자가 응용 프로그램으로 돌아간 후에 이 페이지를 다시 볼 수 없다.
그래서 이런 수요가 생겼다. Admob SDK 내부 플러그인 광고를 클릭하면 페이지가 사라지지 않지만 이Activity를 꺼야 한다.
2. SDK의 Activity를 닫는 방법은 무엇일까요?
사실 이 문제를 해결할 수 있는 두 가지 방법이 있다.
1. ActivityLifecycleCallbacks를 등록합니다.ActivityLifecycleCallbacks에 대해서는 이전 글에서 설명했습니다.'안드로이드 감청 앱이 통합된 SDK의 Activity'는 전반적으로 Activity Lifecycle Callbacks 감청 앱에 등록된 모든 Activity의 생명주기로 리셋 방법에서 플러그인 광고 Activity의 대상을 받아 멤버 변수로 저장하고 광고의 리셋을 클릭하면 닫는다.
구체적인 코드는 다음과 같습니다.
public class ActivityManager implements Application.ActivityLifecycleCallbacks {
private Activity activity;
public void registerActivityLifecycleCallbacks() {
AdApplication.getApp().registerActivityLifecycleCallbacks(this);
}
public void closeAdActivity() {
if (activity != null) {
activity.finish();
}
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if(activity instanceof com.google.android.gms.ads.AdActivity) {
this.activity = activity;
}
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
2. 두 번째 방법:
Actvity launchMode 를 활용합니다.
Activity에는 네 종류의 launchMode가 있다는 것을 우리는 모두 알고 있다.각각: standard singleTop singleTask singleInstance.SingleTask 가 필요합니다.간단히 말해 singleTask 원리를 이용하여 플러그인 Activity를 끄는 것이다.
Activity의launchMode를singleTask로 설정하고 이Activity를 시작하면 이Activity가 있는 작업 창고에 하나의 실례만 존재한다는 것을 알 수 있습니다.Activity A의launchMode가singleTask일 때,Activity A 위에 Activity B가 프론트에 있을 경우.Activity A가 다시 시작됩니다.Activity A를 다시 만들지 않고 Activity B 아래의 Activity A를 다시 조정하며 Activity B는 작업 스택에서 제외됩니다.
원리를 알았으니 이제 간단해졌다.(1) manifest에서 플러그인 광고의Activity를 설명하고 작업 창고를 지정합니다.launchMode는singleTask입니다.AdActivity로 가정해 보겠습니다.
<activity
android:name=".AdActivity"
android:singleTask="singleTask"
android:taskAffinity="com.demo.ad"/>
(2). 그런 다음 빈 Activity를 선언하고 SingleTask를 SingleTask로 선언하며 ADActivity와 같은 작업 스택에 배치합니다.
<activity
android:name=".EmptyActivity"
android:launchMode="singleTask"
android:taskAffinity="com.demo.ad"/>
(3) AdActivity를 시작하기 전에 EmptyActivity를 시작합니다.EmptyActivity 를 시작하기 전에 AdActivity 를 시작하십시오.AdActivity를 종료해야 할 경우 EmptyActivity를 다시 시작하기만 하면 됩니다.이것이 바로 SingleTask의 원리입니다.
(4) 이때 EmptyActivity는 아직 있지만 EmptyActivity는 비어 있습니다. AdActivity가 존재하는 것을 닫는 데 협조하기 위해서입니다.그래서 그finish가 필요합니다.EmptyActivity에서 onNew Intent () 방법을 다시 쓴 다음finish () 를 호출하면 됩니다.
/**
* onNewIntent Activity 。
* @param intent
*/
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
finish();
}
조금이라도 안전하기를 원한다면 EmptyActivity를 투명하게 설정하면 흰색 화면이 나타나지 않는다.
3. 주의해야 할 것은 상업화의 측면에서 볼 때 이렇게 하는 것을 건의하지 않는다는 것이다.상업화는 많은 통계 데이터를 필요로 하기 때문에 만약에 우리가 ADActivity 점프를 클릭한 후에 ADActivity가 startActivityForResult 점프 광고 페이지를 호출하고onActivityResult 방법을 다시 썼다면 데이터를 얻어야 한다.만약 우리가 이 AdActivity를 강제로 폐쇄한다면, AdActivity가 필요한 데이터를 얻지 못하게 하고, 광고 수입에 영향을 줄 수 있다.