Android 当应用程序重新启动并最小化时启动新活动

Android 当应用程序重新启动并最小化时启动新活动,android,android-activity,broadcastreceiver,phone-call,Android,Android Activity,Broadcastreceiver,Phone Call,第一次提问时,请礼貌:) 我想创建一个应用程序,当你接到来电时,它会显示一条消息(通过启动新活动) 我做到了,除了一个问题。当我第一次启动应用程序时: 1) 我必须在应用程序提前运行时打电话才能按计划工作 2) 然后我可以最小化它 3) 甚至锁定手机,应用程序就能完美运行 但是 1) 如果我启动应用程序 2) 最小化它 3) 然后打电话,什么都不发生:( 4) 我必须打开它,打电话,然后再次最小化,才能正常运行 我正在使用android模拟器来测试它 main活动: public class M

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

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

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

1) 我必须在应用程序提前运行时打电话才能按计划工作

2) 然后我可以最小化它

3) 甚至锁定手机,应用程序就能完美运行

但是

1) 如果我启动应用程序

2) 最小化它

3) 然后打电话,什么都不发生:(

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

我正在使用android模拟器来测试它

main活动:

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);
    }
}
呼叫接收器:

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);
    }
}
收入呼叫活动:

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

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

这里很少有例外,文档中提到了这一点,并解释了为什么当你的应用程序在前台时它会工作


我认为您应该发出一个通知,显示您打算在活动中显示的消息(或一个非常简化的UI),单击该通知将以您的UI的全部功能打开您的活动。

感谢您的回答,非常有用。我将使用文档中提到的通知解决方案。但是,您能否更具体地介绍一下如何启动一个非常简化的UI。什么样的用户界面?我的主要目标是在接到来电时尽可能地(用任何类型的消息)提醒用户。如果是文本消息,则更容易——只需发出标准通知即可。选择一个标题和描述并启动它。看见