Android 当应用程序重新启动并最小化时启动新活动
第一次提问时,请礼貌:) 我想创建一个应用程序,当你接到来电时,它会显示一条消息(通过启动新活动) 我做到了,除了一个问题。当我第一次启动应用程序时: 1) 我必须在应用程序提前运行时打电话才能按计划工作 2) 然后我可以最小化它 3) 甚至锁定手机,应用程序就能完美运行 但是 1) 如果我启动应用程序 2) 最小化它 3) 然后打电话,什么都不发生:( 4) 我必须打开它,打电话,然后再次最小化,才能正常运行 我正在使用android模拟器来测试它 main活动: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
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。什么样的用户界面?我的主要目标是在接到来电时尽可能地(用任何类型的消息)提醒用户。如果是文本消息,则更容易——只需发出标准通知即可。选择一个标题和描述并启动它。看见