下面列出了android.app.Instrumentation#addMonitor ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* Waits until {@link TestBrowser} is launched and resumed, and returns it.
*
* @param launchRunnable Runnable that should start the activity.
*/
public static TestBrowser getBrowserActivityWhenLaunched(Runnable launchRunnable) {
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
Instrumentation.ActivityMonitor monitor
= instrumentation.addMonitor(TestBrowser.class.getName(), null, false);
launchRunnable.run();
TestBrowser activity =
(TestBrowser) instrumentation.waitForMonitorWithTimeout(monitor, 3000);
assertNotNull("TestBrowser wasn't launched", activity);
// ActivityMonitor is triggered in onCreate and in onResume, which can lead to races when
// launching several activity instances. So wait for onResume before returning.
boolean resumed = activity.waitForResume(3000);
assertTrue("TestBrowser didn't reach onResume", resumed);
return activity;
}
@Test
public void testNavigation() throws Throwable {
FragmentActivity firstActivity = setupObserverOnResume();
Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
NavigationTestActivitySecond.class.getCanonicalName(), null, false);
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
instrumentation.addMonitor(monitor);
Intent intent = new Intent(firstActivity, NavigationTestActivitySecond.class);
firstActivity.finish();
firstActivity.startActivity(intent);
FragmentActivity secondActivity = (FragmentActivity) monitor.waitForActivity();
assertThat("Failed to navigate", secondActivity, notNullValue());
checkProcessObserverSilent(secondActivity);
}
private FragmentActivity launchDialog() throws Throwable {
Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
NavigationDialogActivity.class.getCanonicalName(), null, false);
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
instrumentation.addMonitor(monitor);
FragmentActivity activity = activityRule.getActivity();
Intent intent = new Intent(activity, NavigationDialogActivity.class);
// disabling animations helps with less flaky API 16 tests
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
activity.startActivity(intent);
FragmentActivity fragmentActivity = (FragmentActivity) monitor.waitForActivity();
TestUtils.waitTillResumed(fragmentActivity, activityRule);
return fragmentActivity;
}
private FragmentActivity launchDialog() throws Throwable {
Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
NavigationDialogActivity.class.getCanonicalName(), null, false);
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
instrumentation.addMonitor(monitor);
FragmentActivity activity = mActivityTestRule.getActivity();
// helps with less flaky API 16 tests
Intent intent = new Intent(activity, NavigationDialogActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
activity.startActivity(intent);
FragmentActivity fragmentActivity = (FragmentActivity) monitor.waitForActivity();
TestUtils.waitTillResumed(fragmentActivity, mActivityTestRule);
return fragmentActivity;
}
/**
* Waits until {@link TestBrowser} is launched and resumed, and returns it.
*
* @param launchRunnable Runnable that should start the activity.
*/
public static TestBrowser getBrowserActivityWhenLaunched(Runnable launchRunnable) {
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
Instrumentation.ActivityMonitor monitor
= instrumentation.addMonitor(TestBrowser.class.getName(), null, false);
launchRunnable.run();
TestBrowser activity =
(TestBrowser) instrumentation.waitForMonitorWithTimeout(monitor, 3000);
assertNotNull("TestBrowser wasn't launched", activity);
// ActivityMonitor is triggered in onCreate and in onResume, which can lead to races when
// launching several activity instances. So wait for onResume before returning.
boolean resumed = activity.waitForResume(3000);
assertTrue("TestBrowser didn't reach onResume", resumed);
return activity;
}
public ActivityListener(Instrumentation instr, Activity activity, long uniqueId) {
this.instr = instr;
IntentFilter filter = null;
this.monitor = instr.addMonitor(filter, null, false);
this.activity = activity;
this.uniqueId = uniqueId;
eventWriter = new EventWriter(uniqueId, this);
activityProcessor = new ActivityProcessor(uniqueId, instr, eventWriter);
activityProcessor.processActivity(activity);
try {
fResumed = Activity.class.getDeclaredField("mResumed");
fResumed.setAccessible(true);
fStopped = Activity.class.getDeclaredField("mStopped");
fStopped.setAccessible(true);
} catch (NoSuchFieldException e) {
Log.e(ActivityProcessor.ANDRIOD_TEST_RECORDER, "NoSuchFieldException", e);
}
}
@Test
public void testNavigationToNonSupport() throws Throwable {
FragmentActivity firstActivity = setupObserverOnResume();
Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
NonSupportActivity.class.getCanonicalName(), null, false);
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
instrumentation.addMonitor(monitor);
Intent intent = new Intent(firstActivity, NonSupportActivity.class);
firstActivity.finish();
firstActivity.startActivity(intent);
NonSupportActivity secondActivity = (NonSupportActivity) monitor.waitForActivity();
assertThat("Failed to navigate", secondActivity, notNullValue());
checkProcessObserverSilent(secondActivity);
}
@Test
public void testPressHomeButton() throws Throwable {
setupObserverOnResume();
Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
NavigationDialogActivity.class.getCanonicalName(), null, false);
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
instrumentation.addMonitor(monitor);
NavigationTestActivityFirst activity = activityTestRule.getActivity();
activity.startActivity(new Intent(activity, NavigationDialogActivity.class));
FragmentActivity dialogActivity = (FragmentActivity) monitor.waitForActivity();
checkProcessObserverSilent(dialogActivity);
List<Event> events = Collections.synchronizedList(new ArrayList<>());
LifecycleObserver collectingObserver = new LifecycleObserver() {
@OnLifecycleEvent(Event.ON_ANY)
public void onStateChanged(@SuppressWarnings("unused") LifecycleOwner provider,
Event event) {
events.add(event);
}
};
addProcessObserver(collectingObserver);
events.clear();
assertThat(activity.moveTaskToBack(true), is(true));
Thread.sleep(ProcessLifecycleOwner.TIMEOUT_MS * 2);
assertThat(events.toArray(), is(new Event[]{ON_PAUSE, ON_STOP}));
events.clear();
Context context = InstrumentationRegistry.getContext();
context.startActivity(new Intent(activity, NavigationDialogActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
waitTillResumed(dialogActivity, activityTestRule);
assertThat(events.toArray(), is(new Event[]{ON_START, ON_RESUME}));
removeProcessObserver(collectingObserver);
dialogActivity.finish();
}
@SuppressWarnings("unchecked")
static <T extends Activity> T recreateActivity(final T activity, ActivityTestRule rule)
throws Throwable {
ActivityMonitor monitor = new ActivityMonitor(
activity.getClass().getCanonicalName(), null, false);
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
instrumentation.addMonitor(monitor);
rule.runOnUiThread(activity::recreate);
T result;
// this guarantee that we will reinstall monitor between notifications about onDestroy
// and onCreate
//noinspection SynchronizationOnLocalVariableOrMethodParameter
synchronized (monitor) {
do {
// the documetation says "Block until an Activity is created
// that matches this monitor." This statement is true, but there are some other
// true statements like: "Block until an Activity is destoyed" or
// "Block until an Activity is resumed"...
// this call will release synchronization monitor's monitor
result = (T) monitor.waitForActivityWithTimeout(TIMEOUT_MS);
if (result == null) {
throw new RuntimeException("Timeout. Failed to recreate an activity");
}
} while (result == activity);
}
return result;
}
private ViewModelActivity recreateActivity() throws Throwable {
Instrumentation.ActivityMonitor monitor = new Instrumentation.ActivityMonitor(
ViewModelActivity.class.getCanonicalName(), null, false);
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
instrumentation.addMonitor(monitor);
final ViewModelActivity previous = mActivityRule.getActivity();
mActivityRule.runOnUiThread(new Runnable() {
@Override
public void run() {
previous.recreate();
}
});
ViewModelActivity result;
// this guarantee that we will reinstall monitor between notifications about onDestroy
// and onCreate
//noinspection SynchronizationOnLocalVariableOrMethodParameter
synchronized (monitor) {
do {
// the documentation says "Block until an Activity is created
// that matches this monitor." This statement is true, but there are some other
// true statements like: "Block until an Activity is destroyed" or
// "Block until an Activity is resumed"...
// this call will release synchronization monitor's monitor
result = (ViewModelActivity) monitor.waitForActivityWithTimeout(4000);
if (result == null) {
throw new RuntimeException("Timeout. Failed to recreate an activity");
}
} while (result == previous);
}
return result;
}
public void test点击链接() {
final Instrumentation inst = getInstrumentation();
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_VIEW);
intentFilter.addDataScheme("http");
intentFilter.addCategory(Intent.CATEGORY_BROWSABLE);
View link = this.getActivity().findViewById(R.id.link);
ActivityMonitor monitor = inst.addMonitor(
intentFilter, null, false);
assertEquals(0, monitor.getHits());
TouchUtils.clickView(this, link);
monitor.waitForActivityWithTimeout(5000);
assertEquals(1, monitor.getHits());
inst.removeMonitor(monitor);
}