当应用程序重新启动并最小化时启动一个新的 activity

Start a new activity when app is fresh started and minimized

第一次提问,请有礼貌:)

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

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

1)我必须在应用 运行 预先启动时拨打 phone 电话才能按计划工作。

2)然后我可以最小化它

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

但是

1)如果我启动应用程序

2)将其最小化

3) 然后进行 phone 调用 没有任何反应 :(

4) 我必须打开它,进行 phone 调用,然后再次最小化到应该的 运行。

我正在使用 android 模拟器进行测试。

主要Activity:

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();
        }
    }

来电Activity:

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);
    }
}

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

参见Restrictions on starting activities from the background

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

我认为您应该发出一个通知,显示您打算在 activity 中显示的消息(或非常简化的 UI),然后单击该通知将打开您的 activity 用你的 UI.

的全部力量