Android拦截/注入/钩子调用
我希望自动调用一些日志语句(不需要开发人员进行任何工作) 例如,下面是演示HelloWorld应用程序(由Android Studio生成)的默认Android拦截/注入/钩子调用,android,overriding,hook,Android,Overriding,Hook,我希望自动调用一些日志语句(不需要开发人员进行任何工作) 例如,下面是演示HelloWorld应用程序(由Android Studio生成)的默认MainActivity类。为了简洁起见,我删除了大部分方法体代码: package com.example.androiddemo; import android.os.Bundle; import com.google.android.material.floatingactionbutton.FloatingActionButton; impo
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
,oncreateoptions菜单
,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.onCreateOptions菜单(菜单)代码>,super.onCreate(savedInstanceState)
,MainActivity.super.onClick(视图)代码>,等等
有没有其他方法可以做到这一点,但不需要开发人员每次都调用super?也许我可以钩住特定的调用