Android拦截/插入/挂接呼叫

时间:2019-12-12 15:13:23

标签: android overriding hook

我希望有一些自动调用的日志语句(在开发人员方面没有任何工作)。

例如,下面是演示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);
    }
}

每当调用onCreateonCreateOptionsMenuonClickonOptionsItemSelected函数时,我都想先记录一些信息(也许是函数名和某种消息) 。我的想法是覆盖这些调用,因此我创建了一个名为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个特定的电话吗?

0 个答案:

没有答案