即实现下图的效果
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("Test",LogUtils.getTopStackInfo());
}
}
关键代码:
public class LogUtils {
/**
* 获取当前栈信息
*/
protected static StackTraceElement getCurrentStackTrace() {
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
int stackOffset = getStackOffset(trace);
if (stackOffset == -1){
return null;
}
StackTraceElement caller = trace[stackOffset];
return caller;
}
protected static int getStackOffset(StackTraceElement[] trace) {
String preClassName = "";
for (int i = 0; i < trace.length; i++) {
StackTraceElement e = trace[i];
String name = e.getClassName();
try {
if (!"".equals(preClassName)){
Class<?> preClass = Class.forName(preClassName);
Class<?> nowClass = Class.forName(name);
if ((preClass == LogUtils.class ||
preClass.getSuperclass() == LogUtils.class) &&
(nowClass != LogUtils.class &&
nowClass.getSuperclass() != LogUtils.class)){
return i;
}
}
preClassName = name;
} catch (ClassNotFoundException exc) {
exc.printStackTrace();
}
}
return -1;
}
protected static String getTopStackInfo() {
StackTraceElement caller = getCurrentStackTrace();
if (caller == null){
return null;
}
String stackTrace = caller.toString();
stackTrace = stackTrace.substring(stackTrace.lastIndexOf('('), stackTrace.length());
String tag = "%s.%s%s";
String callerClazzName = caller.getClassName();
callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1);
tag = String.format(tag, callerClazzName, caller.getMethodName(), stackTrace);
return tag;
}
}