当应用重新启动并最小化时开始一个新的 Activity

时间:2021-03-14 12:55:40

标签: android android-activity broadcastreceiver phone-call

第一次提问,请客气:)

我想创建一个应用,当您接到来电时,它会向您显示一条消息(通过启动一个新活动)。

我做到了,除了一个问题。当我第一次启动应用程序时:

1) 我必须在应用程序运行时拨打电话才能按计划运行。

2)然后我可以最小化它

3)或者甚至锁定手机并且应用程序完美运行

但是

1)如果我启动应用程序

2) 最小化它

3)然后拨打电话什么都没发生 :(

4) 我必须打开它,拨打电话,然后再次最小化才能正常运行。

我正在使用安卓模拟器来测试它。

主要活动:

public class MainActivity extends AppCompatActivity
{


    IntentFilter intentFilter;
    CallReceiver callReceiver;


    private void init()
    {
        intentFilter = new IntentFilter();
        callReceiver = new CallReceiver();
    }


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        init();



        intentFilter.addAction("android.intent.action.PHONE_STATE");
        intentFilter.addAction("android.intent.action.NEW_OUTGOING_CALL");

        registerReceiver(callReceiver,intentFilter);


    }

呼叫接收者:

public class CallReceiver extends PhonecallReceiver
    {

        public static final String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";


        @Override
        protected void onIncomingCallStarted(Context ctx, String number, Date start)
        {

            openNewActivity(number,ctx);

        }

        @Override
        protected void onOutgoingCallStarted(Context ctx, String number, Date start)
        {
        }

        @Override
        protected void onIncomingCallEnded(Context ctx, String number, Date start, Date end)
        {
        }

        @Override
        protected void onOutgoingCallEnded(Context ctx, String number, Date start, Date end)
        {
        }

        @Override
        protected void onMissedCall(Context ctx, String number, Date missed)
        {
        }



        private void openNewActivity(String number,Context context)
        {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    final StringBuilder builder = new StringBuilder();

                    try {
                        
                        Intent i = new Intent(context, IncomingCallActivity.class);
                        String message = "Message I want to be displayed";
                        i.putExtra(EXTRA_MESSAGE, message);


                        final Handler handler = new Handler(Looper.getMainLooper());
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                //Do something after 100ms
                                context.startActivity(i);
                            }
                        }, 1000);


                    } catch (Exception e) {
                        builder.append("Error : ").append(e.getMessage()).append("\n");
                    }

                }
            }).start();
        }
    }

来电活动:

public class IncomingCallActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // Important: have to do the following in order to show without unlocking
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
                WindowManager.LayoutParams.FLAG_FULLSCREEN |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

        setContentView(R.layout.main);

        Intent intent = getIntent();
        String message= intent.getStringExtra(CallReceiver.EXTRA_MESSAGE);

        TextView text = (TextView)findViewById(R.id.text);
        text.setText(message);
    }
}

1 个答案:

答案 0 :(得分:0)

Android 不再允许从后台启动 Activity,官方建议改为显示通知。

Restrictions on starting activities from the background

文档中提到的例外情况很少,并解释了为什么当您的应用处于前台时它可以工作。

我认为您应该触发一个通知,显示您打算在您的 Activity 中显示的消息(或一个非常简化的 UI),点击该通知将打开您的 Activity,并使用您的 UI 的全部功能。