简体   繁体   English

从广播接收器关闭活动

[英]Close the activity from a broadcast receiver

My Project is about the call recorder. 我的项目与呼叫记录器有关。
I want when the call received, my transparent activity open with a button. 我想在接到电话时用一个按钮打开我的透明活动。 I open my activity from my broadcast receiver class. 我从广播接收器类中打开我的活动。
in this activity, I have a toggle button to activate or deactivate my application. 在此活动中,我有一个切换按钮可以激活或停用我的应用程序。
When a call received, if my toggle button is on, it starts to record the call. 收到呼叫后,如果我的切换按钮处于打开状态,它将开始记录呼叫。 it works OK but when the call is finished, I close my activity from my broadcast receiver class. 正常,但通话结束后,我从广播接收器类中关闭了活动。
like this: first, this is my activity when the call received: 像这样:首先,这是我接到电话时的活动:

   public class Test extends Activity {
static Test tes;
ToggleButton toggleButton;
TextView txt_disable, txt_enable;
private static Context context;
private BroadcastReceiver _closeActivityReceiver = new CloseActivityReceiver();

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    tes = this;
    IntentFilter filter = new IntentFilter("closeNoInternetActivity");
    this.registerReceiver(_closeActivityReceiver, filter);

    toggleButton = findViewById(R.id.togglebtn);
    txt_enable = findViewById(R.id.txt_enable);
    txt_disable = findViewById(R.id.txt_disable);


    if (isActivityRunning(MainActivity.class)) {
        MainActivity.getInstance().finish();

    }
    final SharedPreferences pref = getSharedPreferences("TOGGLE", MODE_PRIVATE);
    boolean sie = pref.getBoolean("STATE", true);

    if (sie == true) {
        Log.i("mhs", "true");
        //to main activity toggleRecord fal hast pass inja user agar bekhad mitone k disable kone
        toggleButton.setChecked(true);
        toggleButton.setText(null);
        toggleButton.setTextOn(null);
        toggleButton.setTextOff(null);
        toggleButton.setBackgroundResource(R.drawable.record_btn);
        txt_disable.setVisibility(View.VISIBLE);
        toggleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                toggleRecord.setChecked(false);
                toggleButton.setBackgroundResource(R.drawable.not_recording_btn);
                finishAffinity();
            }
        });

    } else {
        Log.i("mhs", "false");
        toggleButton.setChecked(false);
        toggleButton.setText(null);
        toggleButton.setTextOn(null);
        toggleButton.setTextOff(null);
        toggleButton.setBackgroundResource(R.drawable.not_recording_btn);
        txt_enable.setVisibility(View.VISIBLE);
        toggleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                toggleRecord.setChecked(true);
                toggleButton.setBackgroundResource(R.drawable.record_btn);
                finishAffinity();
            }
        });


    }


}

protected Boolean isActivityRunning(Class activityClass) {
    ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

    for (ActivityManager.RunningTaskInfo task : tasks) {
        if (activityClass.getCanonicalName().equalsIgnoreCase(task.baseActivity.getClassName()))
            return true;
    }

    return false;
}

private class CloseActivityReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // close this damn activity!

    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    this.unregisterReceiver(this._closeActivityReceiver);
}
public static Test getInstance() {
    return tes;
}
}

and here is my receiver: here I start an activity from the receiver like this when I have a phone call 这是我的接收者:在这里,我接到电话后就从接收者开始这样的活动

switch (state) {
        case TelephonyManager.CALL_STATE_RINGING:
            isIncoming = true;
            callStartTime = new Date();
            savedNumber = number;
            onIncomingCallStarted(context, number, callStartTime);
            Intent i = new Intent(context, Test.class);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);

            Log.i("mhs","zang khord");
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
            if (lastState != TelephonyManager.CALL_STATE_RINGING) {
                isIncoming = false;
                callStartTime = new Date();
                onOutgoingCallStarted(context, savedNumber, callStartTime);
                Log.i("mhs","ghat kard");
            } else {
                isIncoming = true;
                callStartTime = new Date();
                onIncomingCallAnswered(context, savedNumber, callStartTime);
                //vaghti zang mikhore va ghat mikone dar akhar
                Log.i("mhs","ghatid");
                Intent in = new Intent("closeNoInternetActivity");
                context.sendBroadcast(in);
            }

and here I close it like this: 在这里我像这样关闭它:

   case TelephonyManager.CALL_STATE_OFFHOOK:
            if (lastState != TelephonyManager.CALL_STATE_RINGING) {
                isIncoming = false;
                callStartTime = new Date();
                onOutgoingCallStarted(context, savedNumber, callStartTime);
                Log.i("mhs","ghat kard");
            } else {
                isIncoming = true;
                callStartTime = new Date();
                onIncomingCallAnswered(context, savedNumber, callStartTime);
                //vaghti zang mikhore va ghat mikone dar akhar
                Log.i("mhs","ghatid");
                Intent in = new Intent("closeNoInternetActivity");
                context.sendBroadcast(in);
            }

My problem is that I think my activity doesn't close, and it reminds in the background and causes my activity is transparent, then again I have a phone call. 我的问题是我认为我的活动没有结束,并且在后台提醒并导致我的活动透明,然后又打了一个电话。 my ringing screen doesn't show on screen. 我的铃声屏幕没有显示在屏幕上。 I think If I able to close my Test activity in right way, my problem solved. 我认为,如果我能够以正确的方式结束Test活动,那么我的问题就解决了。

Just copy and paste below code. 只需复制并粘贴以下代码即可。 it should work. 它应该工作。 If it doesn't then try modifying finish method you can explicitly call destroy method if needed. 如果不这样做,则尝试修改finish方法,可以根据需要显式调用destroy方法。

public class Test extends Activity {
static Test tes;
private static Context context;
ToggleButton toggleButton;
TextView txt_disable, txt_enable;
private BroadcastReceiver _closeActivityReceiver = new CloseActivityReceiver();

public static Test getInstance() {
    return tes;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    tes = this;
    IntentFilter filter = new IntentFilter("closeNoInternetActivity");
    this.registerReceiver(_closeActivityReceiver, filter);

    toggleButton = findViewById(R.id.togglebtn);
    txt_enable = findViewById(R.id.txt_enable);
    txt_disable = findViewById(R.id.txt_disable);


    if (isActivityRunning(MainActivity.class)) {
        MainActivity.getInstance().finish();

    }
    final SharedPreferences pref = getSharedPreferences("TOGGLE", MODE_PRIVATE);
    boolean sie = pref.getBoolean("STATE", true);

    if (sie == true) {
        Log.i("mhs", "true");
        //to main activity toggleRecord fal hast pass inja user agar bekhad mitone k disable kone
        toggleButton.setChecked(true);
        toggleButton.setText(null);
        toggleButton.setTextOn(null);
        toggleButton.setTextOff(null);
        toggleButton.setBackgroundResource(R.drawable.record_btn);
        txt_disable.setVisibility(View.VISIBLE);
        toggleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                toggleRecord.setChecked(false);
                toggleButton.setBackgroundResource(R.drawable.not_recording_btn);
                finishAffinity();
            }
        });

    } else {
        Log.i("mhs", "false");
        toggleButton.setChecked(false);
        toggleButton.setText(null);
        toggleButton.setTextOn(null);
        toggleButton.setTextOff(null);
        toggleButton.setBackgroundResource(R.drawable.not_recording_btn);
        txt_enable.setVisibility(View.VISIBLE);
        toggleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                toggleRecord.setChecked(true);
                toggleButton.setBackgroundResource(R.drawable.record_btn);
                finishAffinity();
            }
        });


    }


}

protected Boolean isActivityRunning(Class activityClass) {
    ActivityManager activityManager = (ActivityManager) getBaseContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

    for (ActivityManager.RunningTaskInfo task : tasks) {
        if (activityClass.getCanonicalName().equalsIgnoreCase(task.baseActivity.getClassName()))
            return true;
    }

    return false;
}

@Override
public void onDestroy() {
    super.onDestroy();
    this.unregisterReceiver(this._closeActivityReceiver);
}

public void finish() {
    super.finish();
}

private class CloseActivityReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // close this damn activity!

        finish();
    }
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM