Android拦截/注入/钩子调用

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

我希望自动调用一些日志语句(不需要开发人员进行任何工作)

例如,下面是演示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
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?也许我可以钩住特定的调用