Stefano Vuerich
Stefano Vuerich

Reputation: 996

Intercept android.settings.SETTINGS with BroadcastReceiver

Good morning, I'm trying to intercept the Settings activity opening. Basically when a user try to access the global settings activity I want trigger some events.

I'm using a BroadcastReceiver and the code is the following:

public class MainActivity extends Activity {

IntentFilter intentFilter;
BroadcastReceiver receiver;
Button settings;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    intentFilter = new IntentFilter(Settings.ACTION_SETTINGS);

    ((Button)findViewById(R.id.settings)).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Settings.ACTION_SETTINGS);
            startActivity(intent);
            Log.v("MYAPP", "starting intent");
        }
    });

}

@Override
protected void onPause() {
    super.onPause();

    unregisterReceiver(receiver);
    Log.v("MYAPP", "on pause, unregister receiver");
}

@Override
protected void onResume() {
    super.onResume();

    receiver = new MyBroadcastReceiver();
    registerReceiver(receiver, intentFilter);
    Log.v("MYAPP", "on resume, register receiver");
}

private class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v("MYAPP", "received settings intent");
    }
}

}

But no intent is intercepted by the Receiver...

What am I missing?

Thank you for your time

Upvotes: 0

Views: 1621

Answers (2)

Stefano Vuerich
Stefano Vuerich

Reputation: 996

After the feedback I've found another way to intercept settings opening:

 @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    Log.v(TAG, "Focus changed !");

    if (!hasFocus) {
        Log.v(TAG, "Lost focus !");
        ActivityManager am = (ActivityManager) getApplicationContext()
                .getSystemService(Context.ACTIVITY_SERVICE);
        ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
        if (cn != null
                && cn.getClassName().equals(
                        "com.android.settings.Settings")) {
            Log.v(TAG, "settings intercepted");

            // do your stuff

        }
    }
}

Upvotes: 0

CommonsWare
CommonsWare

Reputation: 1006799

What am I missing?

You cannot "intercept" startActivity() calls using a BroadcastReceiver. A BroadcastReceiver receives broadcasts, not startActivity() calls.

Upvotes: 1

Related Questions