Skip to content

Commit

Permalink
EventBus for the Activity scope
Browse files Browse the repository at this point in the history
  • Loading branch information
YoKeyword committed Oct 23, 2017
1 parent 9bd2005 commit db036dc
Show file tree
Hide file tree
Showing 7 changed files with 219 additions and 1 deletion.
1 change: 1 addition & 0 deletions eventbus_activity_scope/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
17 changes: 17 additions & 0 deletions eventbus_activity_scope/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
apply plugin: 'com.android.library'

android {
compileSdkVersion rootProject.compileSdkVersion
buildToolsVersion rootProject.buildToolsVersion

defaultConfig {
minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion

consumerProguardFiles 'proguard-rules.pro'
}
}

dependencies {
provided 'org.greenrobot:eventbus:3.0.0'
}
25 changes: 25 additions & 0 deletions eventbus_activity_scope/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/YoKey/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
12 changes: 12 additions & 0 deletions eventbus_activity_scope/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="me.yokeyword.eventbusactivityscope">

<application>
<provider
android:name="me.yokeyword.eventbusactivityscope.RuntimeTrojanProvider"
android:authorities="me.yokeyword.eventbusactivityscope.trojan"
android:exported="false"
android:multiprocess="true"/>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package me.yokeyword.eventbusactivityscope;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;

import org.greenrobot.eventbus.EventBus;

import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;

/**
* Activity-scope EventBus.
* <p>
* Created by YoKey on 17/10/17.
*/
public class EventBusActivityScope {
private static final String TAG = EventBusActivityScope.class.getSimpleName();

private static AtomicBoolean sInitialized = new AtomicBoolean(false);
private static volatile EventBus sInvalidEventBus;

private static final ArrayList<Activity> sActivityList = new ArrayList<>();
private static final Map<Activity, EventBus> sActivityEventBusScopePool = new ConcurrentHashMap<>();

static void init(Context context) {
if (sInitialized.getAndSet(true)) {
return;
}

((Application) context.getApplicationContext())
.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
synchronized (sActivityList) {
sActivityList.add(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 bundle) {
}

@Override
public void onActivityDestroyed(Activity activity) {
synchronized (sActivityList) {
sActivityList.remove(activity);
}

synchronized (sActivityEventBusScopePool) {
sActivityEventBusScopePool.remove(activity);
}
}
});
}

/**
* Get the activity-scope EventBus instance
*/
public static EventBus getDefault(Activity activity) {
if (activity == null) {
Log.e(TAG, "Can't find the Activity, the Activity is null!");
return invalidEventBus();
}

synchronized (sActivityList) {
if (!sActivityList.contains(activity)) {
Log.e(TAG, "Can't find the Activity, it has been removed!");
return invalidEventBus();
}
}

EventBus eventBus = sActivityEventBusScopePool.get(activity);

if (eventBus == null) {
synchronized (sActivityEventBusScopePool) {
if (sActivityEventBusScopePool.get(activity) == null) {
eventBus = new EventBus();
sActivityEventBusScopePool.put(activity, eventBus);
}
}
}

return eventBus;
}

private static EventBus invalidEventBus() {
if (sInvalidEventBus == null) {
synchronized (EventBusActivityScope.class) {
if (sInvalidEventBus == null) {
sInvalidEventBus = new EventBus();

}
}
}
return sInvalidEventBus;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package me.yokeyword.eventbusactivityscope;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;

/**
* Internal class to initialize EventBusActivityScope.
* @hide
*
* Created by YoKey on 17/10/17.
*/
public class RuntimeTrojanProvider extends ContentProvider {
@Override
public boolean onCreate() {
EventBusActivityScope.init(getContext());
return true;
}

@Override
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
return null;
}

@Override
public String getType(Uri uri) {
return null;
}

@Override
public Uri insert(Uri uri, ContentValues contentValues) {
return null;
}

@Override
public int delete(Uri uri, String s, String[] strings) {
return 0;
}

@Override
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
return 0;
}
}
2 changes: 1 addition & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
@@ -1 +1 @@
include ':demo', ':fragmentation_core', ':fragmentation_swipeback', ':fragmentation'
include ':demo', ':fragmentation_core', ':fragmentation_swipeback', ':fragmentation', ':eventbus_activity_scope'

0 comments on commit db036dc

Please sign in to comment.