Files
android_development/samples/IntentPlayground/src/com/example/android/intentplayground/AMControl.java
Liam Clark bd43fbe931 Intent Playground sample application
The app allows a user to explore the behaviour of different
launch modes, task affinities and intent flags.

It displays the current state of all tasks in the application
and their corresponding flags.

It allows the user to launch a set amount of activities on launch.
This bring the user directly into a state where many options for
exploration are available, rather than having to go through a
complicated setup first.

Access the activity field of RecentTaskInfo using reflection and mirror
the ActivityInstanceInfo into our own value object. This breaks
the compile time dependency on the ActivityInstanceInfo api and turns
it into a runtime dependency.

If the api is missing on the device we can still show the task structure
and log an error with the missing activity instance info.

Known bug: The enable suggestion button crashes the application.
Test: Build and Run

Change-Id: Id0274bae159c16aee6dccd805deb53851ffcf21d
2018-11-26 11:37:35 -08:00

85 lines
3.1 KiB
Java

/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.intentplayground;
import android.content.ComponentName;
import android.content.Intent;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* Provides a backend for launching activities using the ActivityManager command line.
*/
class AMControl {
public static final String TAG = "AMControl";
/**
* Launches the activity specified by an {@link Intent} in the background.
* @param intent The intent to launch.
* @return The output of the "am shell" command.
*/
public static String launchInBackground(Intent intent) {
StringBuilder cmd = new StringBuilder("am start -n ");
ComponentName target = intent.getComponent();
cmd.append(target.getPackageName()).append("/").append(target.getShortClassName());
cmd.append(" -f ").append("0x").append(Integer.toHexString(intent.getFlags()));
cmd.append(" --ez moveToBack true");
return execCmd(cmd.toString());
}
/**
* Executes a shell command in a separate process.
* @param cmd The command to execute.
* @return The output of the command.
*/
public static String execCmd(String cmd) {
StringBuilder output = new StringBuilder();
ProcessBuilder factory = new ProcessBuilder(cmd.split(" "));
String line;
int lineCount = 0;
if (BuildConfig.DEBUG) Log.d(TAG, "Running command " + cmd);
try {
Process proc = factory.start();
// get stdout
BufferedReader reader = new BufferedReader(new InputStreamReader(
proc.getInputStream()));
while ((line = reader.readLine()) != null) {
output.append(line).append('\n');
lineCount++;
}
reader.close();
// get stderr
reader = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
while ((line = reader.readLine()) != null) {
output.append(line).append('\n');
lineCount++;
}
reader.close();
if (BuildConfig.DEBUG) {
Log.d(TAG, String.format("Received %d lines from %s:\n %s",
lineCount, cmd.split(" ")[0], output.toString()));
}
} catch (IOException e) {
if (BuildConfig.DEBUG) Log.e(TAG, output.append(e.getMessage()).toString());
throw new RuntimeException(e);
}
return output.toString();
}
}