fix(autojs): screen request activity memory leak

fix(autojs): idStartsWith not working
This commit is contained in:
hyb1996
2018-04-25 15:53:04 +08:00
parent c488e9ccbb
commit 55f2e7b20a
15 changed files with 129 additions and 103 deletions

View File

@@ -42,7 +42,11 @@ public class CrashHandler implements UncaughtExceptionHandler {
} }
AccessibilityService service = AccessibilityService.getInstance(); AccessibilityService service = AccessibilityService.getInstance();
if (service != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (service != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Log.d(TAG, "disable service: " + service);
service.disableSelf(); service.disableSelf();
} else {
Log.d(TAG, "cannot disable service: " + service);
} }
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
mDefaultHandler.uncaughtException(thread, ex); mDefaultHandler.uncaughtException(thread, ex);

View File

@@ -33,7 +33,6 @@ public class LayoutHierarchyFloatyWindow extends FullScreenFloatyWindow {
private MaterialDialog mNodeInfoDialog; private MaterialDialog mNodeInfoDialog;
private BubblePopupMenu mBubblePopMenu; private BubblePopupMenu mBubblePopMenu;
private NodeInfoView mNodeInfoView; private NodeInfoView mNodeInfoView;
private NodeInfo mSelectedNodeInfo;
private Context mContext; private Context mContext;
private NodeInfo mRootNode; private NodeInfo mRootNode;
private NodeInfo mSelectedNode; private NodeInfo mSelectedNode;
@@ -65,15 +64,12 @@ public class LayoutHierarchyFloatyWindow extends FullScreenFloatyWindow {
mLayoutHierarchyView.setShowClickedNodeBounds(true); mLayoutHierarchyView.setShowClickedNodeBounds(true);
mLayoutHierarchyView.getBoundsPaint().setStrokeWidth(3); mLayoutHierarchyView.getBoundsPaint().setStrokeWidth(3);
mLayoutHierarchyView.getBoundsPaint().setColor(0xFFD32F2F); mLayoutHierarchyView.getBoundsPaint().setColor(0xFFD32F2F);
mLayoutHierarchyView.setOnItemLongClickListener(new LayoutHierarchyView.OnItemLongClickListener() { mLayoutHierarchyView.setOnItemLongClickListener((view, nodeInfo) -> {
@Override mSelectedNode = nodeInfo;
public void onItemLongClick(View view, NodeInfo nodeInfo) { ensureOperationPopMenu();
mSelectedNodeInfo = nodeInfo; if (mBubblePopMenu.getContentView().getMeasuredWidth() <= 0)
ensureOperationPopMenu(); mBubblePopMenu.preMeasure();
if (mBubblePopMenu.getContentView().getMeasuredWidth() <= 0) mBubblePopMenu.showAsDropDown(view, view.getWidth() / 2 - mBubblePopMenu.getContentView().getMeasuredWidth() / 2, 0);
mBubblePopMenu.preMeasure();
mBubblePopMenu.showAsDropDown(view, view.getWidth() / 2 - mBubblePopMenu.getContentView().getMeasuredWidth() / 2, 0);
}
}); });
mLayoutHierarchyView.setRootNode(mRootNode); mLayoutHierarchyView.setRootNode(mRootNode);
if (mSelectedNode != null) if (mSelectedNode != null)
@@ -116,7 +112,7 @@ public class LayoutHierarchyFloatyWindow extends FullScreenFloatyWindow {
void showNodeInfo() { void showNodeInfo() {
ensureNodeInfoDialog(); ensureNodeInfoDialog();
mNodeInfoView.setNodeInfo(mSelectedNodeInfo); mNodeInfoView.setNodeInfo(mSelectedNode);
mNodeInfoDialog.show(); mNodeInfoDialog.show();
} }

View File

@@ -18,7 +18,7 @@
<activity <activity
android:name="com.stardust.autojs.core.image.ScreenCaptureRequestActivity" android:name="com.stardust.autojs.core.image.capture.ScreenCaptureRequestActivity"
android:excludeFromRecents="true" android:excludeFromRecents="true"
android:taskAffinity="com.stardust.autojs.runtime.api.image.ScreenCaptureRequestActivity" android:taskAffinity="com.stardust.autojs.runtime.api.image.ScreenCaptureRequestActivity"
android:theme="@style/AppTheme.Transparent"/> android:theme="@style/AppTheme.Transparent"/>

View File

@@ -3,11 +3,6 @@ package com.stardust.autojs;
import android.app.Activity; import android.app.Activity;
import android.app.Application; import android.app.Application;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@@ -18,24 +13,20 @@ import com.stardust.app.SimpleActivityLifecycleCallbacks;
import com.stardust.autojs.core.accessibility.AccessibilityBridge; import com.stardust.autojs.core.accessibility.AccessibilityBridge;
import com.stardust.autojs.core.console.GlobalStardustConsole; import com.stardust.autojs.core.console.GlobalStardustConsole;
import com.stardust.autojs.core.console.StardustConsole; import com.stardust.autojs.core.console.StardustConsole;
import com.stardust.autojs.core.image.ScreenCaptureRequestActivity; import com.stardust.autojs.core.image.capture.ScreenCaptureRequestActivity;
import com.stardust.autojs.core.image.ScreenCaptureRequester; import com.stardust.autojs.core.image.capture.ScreenCaptureRequester;
import com.stardust.autojs.core.inputevent.InputEventObserver;
import com.stardust.autojs.core.record.accessibility.AccessibilityActionRecorder; import com.stardust.autojs.core.record.accessibility.AccessibilityActionRecorder;
import com.stardust.autojs.core.util.Shell; import com.stardust.autojs.core.util.Shell;
import com.stardust.autojs.engine.LoopBasedJavaScriptEngine; import com.stardust.autojs.engine.LoopBasedJavaScriptEngine;
import com.stardust.autojs.engine.RootAutomatorEngine; import com.stardust.autojs.engine.RootAutomatorEngine;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.engine.ScriptEngineManager; import com.stardust.autojs.engine.ScriptEngineManager;
import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig; import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
import com.stardust.autojs.runtime.api.AppUtils; import com.stardust.autojs.runtime.api.AppUtils;
import com.stardust.autojs.runtime.api.Console; import com.stardust.autojs.runtime.api.Console;
import com.stardust.autojs.runtime.exception.ScriptException;
import com.stardust.autojs.script.AutoFileSource; import com.stardust.autojs.script.AutoFileSource;
import com.stardust.autojs.script.JavaScriptSource; import com.stardust.autojs.script.JavaScriptSource;
import com.stardust.util.ScreenMetrics; import com.stardust.util.ScreenMetrics;
import com.stardust.util.Supplier;
import com.stardust.util.UiHandler; import com.stardust.util.UiHandler;
import com.stardust.view.accessibility.AccessibilityInfoProvider; import com.stardust.view.accessibility.AccessibilityInfoProvider;
import com.stardust.view.accessibility.AccessibilityNotificationObserver; import com.stardust.view.accessibility.AccessibilityNotificationObserver;
@@ -224,7 +215,6 @@ public abstract class AutoJs {
private class ScreenCaptureRequesterImpl extends ScreenCaptureRequester.AbstractScreenCaptureRequester { private class ScreenCaptureRequesterImpl extends ScreenCaptureRequester.AbstractScreenCaptureRequester {
@Override @Override
public void setOnActivityResultCallback(Callback callback) { public void setOnActivityResultCallback(Callback callback) {
super.setOnActivityResultCallback((result, data) -> { super.setOnActivityResultCallback((result, data) -> {

View File

@@ -17,8 +17,8 @@ public class CodeGenerator {
public static final int WAIT_FOR = 2; public static final int WAIT_FOR = 2;
public static final int EXISTS = 3; public static final int EXISTS = 3;
private ReadOnlyUiObject mRoot; private final ReadOnlyUiObject mRoot;
private ReadOnlyUiObject mTarget; private final ReadOnlyUiObject mTarget;
private boolean mUsingId = true; private boolean mUsingId = true;
private boolean mUsingDesc = true; private boolean mUsingDesc = true;
private boolean mUsingText = true; private boolean mUsingText = true;

View File

@@ -13,7 +13,6 @@ import com.stardust.automator.UiGlobalSelector;
import com.stardust.automator.UiObject; import com.stardust.automator.UiObject;
import com.stardust.automator.UiObjectCollection; import com.stardust.automator.UiObjectCollection;
import com.stardust.automator.filter.DfsFilter; import com.stardust.automator.filter.DfsFilter;
import com.stardust.util.DeveloperUtils;
import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator; import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS; import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS;
@@ -208,6 +207,11 @@ public class UiSelector extends UiGlobalSelector {
String fullId = mAccessibilityBridge.getInfoProvider().getLatestPackage() + ":id/" + id; String fullId = mAccessibilityBridge.getInfoProvider().getLatestPackage() + ":id/" + id;
return fullId.equals(nodeInfo.getViewIdResourceName()); return fullId.equals(nodeInfo.getViewIdResourceName());
} }
@Override
public String toString() {
return "id(\"" + id + "\")";
}
}); });
} else { } else {
super.id(id); super.id(id);
@@ -215,6 +219,27 @@ public class UiSelector extends UiGlobalSelector {
return this; return this;
} }
@Override
public UiGlobalSelector idStartsWith(String prefix) {
if (!prefix.contains(":")) {
addFilter(new DfsFilter() {
@Override
protected boolean isIncluded(UiObject nodeInfo) {
String fullIdPrefix = mAccessibilityBridge.getInfoProvider().getLatestPackage() + ":id/" + prefix;
String id = nodeInfo.getViewIdResourceName();
return id != null && id.startsWith(fullIdPrefix);
}
@Override
public String toString() {
return "idStartsWith(\"" + prefix + "\")";
}
});
} else {
super.idStartsWith(prefix);
}
return this;
}
private boolean performAction(int action, ActionArgument... arguments) { private boolean performAction(int action, ActionArgument... arguments) {
return untilFind().performAction(action, arguments); return untilFind().performAction(action, arguments);
@@ -351,5 +376,4 @@ public class UiSelector extends UiGlobalSelector {
new ActionArgument.IntActionArgument(ACTION_ARGUMENT_ROW_INT, row), new ActionArgument.IntActionArgument(ACTION_ARGUMENT_ROW_INT, row),
new ActionArgument.IntActionArgument(ACTION_ARGUMENT_COLUMN_INT, column)); new ActionArgument.IntActionArgument(ACTION_ARGUMENT_COLUMN_INT, column));
} }
} }

View File

@@ -1,4 +1,4 @@
package com.stardust.autojs.core.image; package com.stardust.autojs.core.image.capture;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
@@ -9,6 +9,7 @@ import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi; import android.support.annotation.RequiresApi;
import com.stardust.app.OnActivityResultDelegate; import com.stardust.app.OnActivityResultDelegate;
import com.stardust.util.IntentExtras;
/** /**
* Created by Stardust on 2017/5/22. * Created by Stardust on 2017/5/22.
@@ -17,32 +18,41 @@ import com.stardust.app.OnActivityResultDelegate;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class ScreenCaptureRequestActivity extends Activity { public class ScreenCaptureRequestActivity extends Activity {
private static ScreenCaptureRequester.Callback sCallback;
public static void request(Context context, ScreenCaptureRequester.Callback callback) {
if (sCallback != null) {
return;
}
sCallback = callback;
context.startActivity(new Intent(context, ScreenCaptureRequestActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
private OnActivityResultDelegate.Mediator mOnActivityResultDelegateMediator = new OnActivityResultDelegate.Mediator(); private OnActivityResultDelegate.Mediator mOnActivityResultDelegateMediator = new OnActivityResultDelegate.Mediator();
private ScreenCaptureRequester mScreenCaptureRequester; private ScreenCaptureRequester mScreenCaptureRequester;
private ScreenCaptureRequester.Callback mCallback;
public static void request(Context context, ScreenCaptureRequester.Callback callback) {
Intent intent = new Intent(context, ScreenCaptureRequestActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
IntentExtras.newExtras()
.put("callback", callback)
.putInIntent(intent);
context.startActivity(intent);
}
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
IntentExtras extras = IntentExtras.fromIntentAndRelease(getIntent());
if (extras == null) {
finish();
return;
}
mCallback = extras.get("callback");
if (mCallback == null) {
finish();
return;
}
mScreenCaptureRequester = new ScreenCaptureRequester.ActivityScreenCaptureRequester(mOnActivityResultDelegateMediator, this); mScreenCaptureRequester = new ScreenCaptureRequester.ActivityScreenCaptureRequester(mOnActivityResultDelegateMediator, this);
mScreenCaptureRequester.setOnActivityResultCallback(sCallback); mScreenCaptureRequester.setOnActivityResultCallback(mCallback);
mScreenCaptureRequester.request(); mScreenCaptureRequester.request();
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
mCallback = null;
if (mScreenCaptureRequester == null) if (mScreenCaptureRequester == null)
return; return;
mScreenCaptureRequester.cancel(); mScreenCaptureRequester.cancel();
@@ -52,8 +62,7 @@ public class ScreenCaptureRequestActivity extends Activity {
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mOnActivityResultDelegateMediator.onActivityResult(requestCode, resultCode, data); mOnActivityResultDelegateMediator.onActivityResult(requestCode, resultCode, data);
sCallback = null;
finish(); finish();
} }
} }

View File

@@ -1,4 +1,4 @@
package com.stardust.autojs.core.image; package com.stardust.autojs.core.image.capture;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;

View File

@@ -1,4 +1,4 @@
package com.stardust.autojs.core.image; package com.stardust.autojs.core.image.capture;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;

View File

@@ -7,10 +7,8 @@ import android.os.Bundle;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import com.stardust.autojs.engine.LoopBasedJavaScriptEngine; import com.stardust.autojs.engine.LoopBasedJavaScriptEngine;
import com.stardust.autojs.engine.RhinoJavaScriptEngine;
import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.engine.ScriptEngineManager; import com.stardust.autojs.engine.ScriptEngineManager;
import com.stardust.autojs.engine.ScriptEngineProxy;
import com.stardust.autojs.script.ScriptSource; import com.stardust.autojs.script.ScriptSource;
import com.stardust.util.IntentExtras; import com.stardust.util.IntentExtras;
@@ -57,13 +55,13 @@ public class ScriptExecuteActivity extends AppCompatActivity {
} }
private IntentExtras readIntentExtras(Bundle savedInstanceState) { private IntentExtras readIntentExtras(Bundle savedInstanceState) {
IntentExtras extras = IntentExtras.fromIntent(getIntent()); IntentExtras extras = IntentExtras.fromIntentAndRelease(getIntent());
if (extras == null && savedInstanceState != null) { if (extras == null && savedInstanceState != null) {
int id = savedInstanceState.getInt(IntentExtras.EXTRA_ID, -1); int id = savedInstanceState.getInt(IntentExtras.EXTRA_ID, -1);
if (id == -1) { if (id == -1) {
return null; return null;
} }
extras = IntentExtras.fromId(id); extras = IntentExtras.fromIdAndRelease(id);
} }
return extras; return extras;
} }

View File

@@ -1,22 +1,15 @@
package com.stardust.autojs.runtime; package com.stardust.autojs.runtime;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build; import android.os.Build;
import android.os.Looper; import android.os.Looper;
import android.view.MotionEvent;
import android.view.View;
import com.stardust.app.GlobalAppContext; import com.stardust.app.GlobalAppContext;
import com.stardust.autojs.BuildConfig;
import com.stardust.autojs.R; import com.stardust.autojs.R;
import com.stardust.autojs.ScriptEngineService; import com.stardust.autojs.ScriptEngineService;
import com.stardust.autojs.annotation.ScriptVariable; import com.stardust.autojs.annotation.ScriptVariable;
import com.stardust.autojs.core.accessibility.AccessibilityBridge; import com.stardust.autojs.core.accessibility.AccessibilityBridge;
import com.stardust.autojs.core.image.Colors; import com.stardust.autojs.core.image.Colors;
import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.engine.RhinoJavaScriptEngine;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.rhino.AndroidClassLoader; import com.stardust.autojs.rhino.AndroidClassLoader;
import com.stardust.autojs.runtime.api.AbstractShell; import com.stardust.autojs.runtime.api.AbstractShell;
import com.stardust.autojs.runtime.api.AppUtils; import com.stardust.autojs.runtime.api.AppUtils;
@@ -33,7 +26,7 @@ import com.stardust.autojs.runtime.api.Threads;
import com.stardust.autojs.runtime.api.Timers; import com.stardust.autojs.runtime.api.Timers;
import com.stardust.autojs.core.accessibility.UiSelector; import com.stardust.autojs.core.accessibility.UiSelector;
import com.stardust.autojs.runtime.api.Images; import com.stardust.autojs.runtime.api.Images;
import com.stardust.autojs.core.image.ScreenCaptureRequester; import com.stardust.autojs.core.image.capture.ScreenCaptureRequester;
import com.stardust.autojs.runtime.api.Dialogs; import com.stardust.autojs.runtime.api.Dialogs;
import com.stardust.autojs.runtime.exception.ScriptEnvironmentException; import com.stardust.autojs.runtime.exception.ScriptEnvironmentException;
import com.stardust.autojs.runtime.exception.ScriptException; import com.stardust.autojs.runtime.exception.ScriptException;
@@ -59,8 +52,6 @@ import java.lang.ref.WeakReference;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import javax.microedition.khronos.opengles.GL;
/** /**
* Created by Stardust on 2017/1/27. * Created by Stardust on 2017/1/27.

View File

@@ -18,8 +18,8 @@ import com.stardust.autojs.annotation.ScriptVariable;
import com.stardust.autojs.core.image.ColorFinder; import com.stardust.autojs.core.image.ColorFinder;
import com.stardust.autojs.core.image.ImageWrapper; import com.stardust.autojs.core.image.ImageWrapper;
import com.stardust.autojs.core.image.OpenCVHelper; import com.stardust.autojs.core.image.OpenCVHelper;
import com.stardust.autojs.core.image.ScreenCaptureRequester; import com.stardust.autojs.core.image.capture.ScreenCaptureRequester;
import com.stardust.autojs.core.image.ScreenCapturer; import com.stardust.autojs.core.image.capture.ScreenCapturer;
import com.stardust.autojs.core.image.TemplateMatching; import com.stardust.autojs.core.image.TemplateMatching;
import com.stardust.autojs.core.ui.inflater.util.Drawables; import com.stardust.autojs.core.ui.inflater.util.Drawables;
import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.ScriptRuntime;

View File

@@ -8,7 +8,11 @@ import java.util.List;
* Created by Stardust on 2017/3/9. * Created by Stardust on 2017/3/9.
*/ */
public class IdFilter extends ListFilter.Default { public class IdFilter {
public interface FullIdGetter {
String getFullId(String id);
}
private static final KeyGetter ID_GETTER = new KeyGetter() { private static final KeyGetter ID_GETTER = new KeyGetter() {
@@ -26,7 +30,6 @@ public class IdFilter extends ListFilter.Default {
public static StringEqualsFilter equals(String id) { public static StringEqualsFilter equals(String id) {
return new StringEqualsFilter(id, ID_GETTER); return new StringEqualsFilter(id, ID_GETTER);
} }
public static StringStartsWithFilter startsWith(String prefix) { public static StringStartsWithFilter startsWith(String prefix) {
return new StringStartsWithFilter(prefix, ID_GETTER); return new StringStartsWithFilter(prefix, ID_GETTER);
} }
@@ -43,16 +46,4 @@ public class IdFilter extends ListFilter.Default {
return new StringMatchesFilter(regex, ID_GETTER); return new StringMatchesFilter(regex, ID_GETTER);
} }
private String mId;
private IdFilter(String id) {
mId = id;
}
@Override
public List<UiObject> filter(UiObject node) {
return node.findByViewId(mId);
}
} }

View File

@@ -8,11 +8,11 @@ import com.stardust.automator.UiObject;
public class StringEqualsFilter extends DfsFilter { public class StringEqualsFilter extends DfsFilter {
private String mText; private String mValue;
private KeyGetter mKeyGetter; private KeyGetter mKeyGetter;
public StringEqualsFilter(String text, KeyGetter getter) { public StringEqualsFilter(String value, KeyGetter getter) {
mText = text; mValue = value;
mKeyGetter = getter; mKeyGetter = getter;
} }
@@ -20,13 +20,13 @@ public class StringEqualsFilter extends DfsFilter {
protected boolean isIncluded(UiObject nodeInfo) { protected boolean isIncluded(UiObject nodeInfo) {
String key = mKeyGetter.getKey(nodeInfo); String key = mKeyGetter.getKey(nodeInfo);
if (key != null) { if (key != null) {
return key.equals(mText); return key.equals(mValue);
} }
return false; return false;
} }
@Override @Override
public String toString() { public String toString() {
return mKeyGetter.toString() + "(\"" + mText + "\")"; return mKeyGetter.toString() + "(\"" + mValue + "\")";
} }
} }

View File

@@ -19,28 +19,6 @@ public class IntentExtras implements Serializable {
private static AtomicInteger mMaxId = new AtomicInteger(-1); private static AtomicInteger mMaxId = new AtomicInteger(-1);
private static SparseArray<Map<String, Object>> extraStore = new SparseArray<>(); private static SparseArray<Map<String, Object>> extraStore = new SparseArray<>();
public static IntentExtras newExtras() {
return new IntentExtras();
}
public static IntentExtras fromIntent(Intent intent) {
int id = intent.getIntExtra(EXTRA_ID, -1);
if (id < 0) {
return null;
}
return fromId(id);
}
public static IntentExtras fromId(int id) {
Map<String, Object> map = extraStore.get(id);
if (map == null) {
return null;
}
extraStore.remove(id);
return new IntentExtras(id, map);
}
private Map<String, Object> mMap; private Map<String, Object> mMap;
private int mId; private int mId;
@@ -56,6 +34,46 @@ public class IntentExtras implements Serializable {
mMap = map; mMap = map;
} }
public static IntentExtras newExtras() {
return new IntentExtras();
}
public static IntentExtras fromIntentAndRelease(Intent intent) {
int id = intent.getIntExtra(EXTRA_ID, -1);
if (id < 0) {
return null;
}
return fromIdAndRelease(id);
}
public static IntentExtras fromIdAndRelease(int id) {
Map<String, Object> map = extraStore.get(id);
if (map == null) {
return null;
}
extraStore.remove(id);
return new IntentExtras(id, map);
}
public static IntentExtras fromId(int id) {
Map<String, Object> map = extraStore.get(id);
if (map == null) {
return null;
}
return new IntentExtras(id, map);
}
public static IntentExtras fromIntent(Intent intent) {
int id = intent.getIntExtra(EXTRA_ID, -1);
if (id < 0) {
return null;
}
return fromId(id);
}
public int getId() { public int getId() {
return mId; return mId;
} }
@@ -80,5 +98,10 @@ public class IntentExtras implements Serializable {
return intent; return intent;
} }
public void release() {
extraStore.remove(mId);
mId = -1;
}
} }