我希望有一些自动调用的日志语句(在开发人员方面没有任何工作)。
例如,下面是演示HelloWorld应用程序(由Android Studio生成)的默认MainActivity
类。为了简洁起见,我删除了大多数方法主体代码:
package com.example.androiddemo;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import com.example.androidlogger.*;
public class MainActivity extends AndroidLogger {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
}
每当调用onCreate
,onCreateOptionsMenu
,onClick
或onOptionsItemSelected
函数时,我都想先记录一些信息(也许是函数名和某种消息) 。我的想法是覆盖这些调用,因此我创建了一个名为androidlogger
的单独模块:
package com.example.androidlogger;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.view.Menu;
public class AndroidLogger extends AppCompatActivity implements View.OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
String currentDateandTime = sdf.format(new Date());
Log.i("AndroidLogger", "onCreate method called at: " + currentDateandTime);
super.onCreate(savedInstanceState);
}
@Override
public void onClick(View v) {
Log.i("AndroidLogger", "Clicked from AndroidLogger");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
Log.i("AndroidLogger", "onCreateOptionsMenu from AndroidLogger");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.i("AndroidLogger", "onOptionsItemSelected from AndroidLogger");
return super.onOptionsItemSelected(item);
}
}
MainActivity
本身扩展了AndroidLogger
,后者扩展了AppCompatActivity
。这可行,但是要求开发人员始终调用super.XYZ
。例如:super.onCreateOptionsMenu(menu);
,super.onCreate(savedInstanceState);
,MainActivity.super.onClick(view);
等。
还有另一种方法可以执行此操作,而无需开发人员每次都调用super吗?也许我可以hook
个特定的电话吗?