我正在编写一个在固定时间显示活动的应用程序.
我用这样的代码从服务开始活动:
intent.setClass(context, FakeAction.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
在FakeAction的onCreate方法中,我需要唤醒设备并启动声音消息:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
Run Code Online (Sandbox Code Playgroud)
onCreate中有很多代码可以在屏幕上显示信息并启动声音信息.
这是一个onPause方法:
@Override
protected void onPause()
{
Log.i(TAG, "onPause");
//Stop mediaPlayer
if(mp != null)
{
if(mp.isPlaying())mp.stop();
mp.release();
mp = null;
}
//Restore volume
if(audioManager != null)
{
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, savedVolume, 0);
}
//Stop minute timer
handler.removeCallbacks(minuteReceiver);
super.onPause();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,在onCreate之后立即调用onPause()方法.所以我的声音消息立即停止.
但是如果在未锁定屏幕时启动活动,则在onCreate()之后不会立即调用onPasue();
即使我评论所有"getWindow().addFlags()"字符串,onCreate()在onCreate()之后调用,如果屏幕被锁定.
问题是为什么在onCreate之后立即调用onPause?当用户按下后退按钮时,如何区分onPause()方法的立即调用和onPause()的调用?
以下是活动的代码.我使用MVP模式,因此,主要代码在演示者中.但即使我评论所有演示者的调用(就像我在本例中所做的那样),onCreate()之后立即调用onPause()
我是否可以在AsyncTask中开始活动?AsyncTask是从服务启动的.如果完成,则在AsyncTask之后停止服务.
public class FakeAction extends RoboActivity
implements
View.OnClickListener
,AlarmAction
{
private static final String TAG = "TA FakeAction";
@InjectView(R.id.aa_btn_Stop) Button btnStop;
@InjectView(R.id.aa_btn_Snooze) Button btnSnooze;
@InjectView(R.id.aa_tv_CurTime) TextView tvCurTime; …Run Code Online (Sandbox Code Playgroud) 我有一个活动需要在启动时打开屏幕(以防屏幕关闭).所以在我看来onCreate,我有:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
|WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
|WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
|WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
Run Code Online (Sandbox Code Playgroud)
使用这种直接的组合,我能够在我的后台服务启动时显示我的活动(是的,这是一个合法的案例).
然而,问题是当我在这种情况下启动我的活动时,存在一种非常奇怪的生命周期行为.使用广泛的日志记录,我能够确定在活动开始后立即发生以下7个步骤:
看到了吗?对于简单的活动开始,onStart被调用两次.更重要的是,onStop被神秘地称为,即使活动刚刚开始 - 没有任何事情会导致它停止.
我已经在许多不同的场景中对此进行了测试,看起来这种奇怪的行为只发生在屏幕关闭且活动在被破坏后启动时.如果屏幕打开,或者活动已停止[但尚未销毁],则活动正常启动,onStart仅调用一次.
结论:似乎当我的活动启动并且强制启动屏幕时,Android会启动活动,然后停止活动,然后再次启动它,原因无关紧要.
那么:为什么会这样呢?我有什么办法可以解决这个问题(所以只有在有正当理由的情况下才会调用onStop)?
笔记:
singleTasklaunchmode当我在扩展FirebaseMessagingService的服务中收到Push消息并在此类中启动Activity时,将执行以下生命周期事件/方法:
我开发了下面的解决方案,我在其中添加一个布尔值,以确定屏幕是否打开/关闭.但这很麻烦,当屏幕在锁定模式下打开时,它不起作用.
因为当屏幕未关闭且显示MainActivity,并且接收到推送消息时,该行为是默认的生命周期行为,因此是正确的.打开屏幕并显示MainActivity时,这是相同的流程:
这是正确的,也是可以预期的.
class VideoRingingActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
if (ViewUtils.isScreenActive(activity)) {
screenIsNotLocked = true
}
ViewUtils.disableLockScreen(this)
binding = DataBindingUtil.setContentView(this, R.layout.activity_video_ringing)
}
override fun onStart() {
super.onStart()
if (screenIsNotLocked) {
}
}
override fun onResume() {
super.onResume()
if (screenIsNotLocked) {
}
}
override fun onPause() {
super.onPause()
if (screenIsNotLocked) {
}
}
override fun onStop() {
super.onStop()
if …Run Code Online (Sandbox Code Playgroud) 编辑* 在 Android 设备上进行测试时出现此问题。在模拟器上测试时不会出现此问题。
我正在开始一项新活动,我看到在调用 onResume 后立即调用了 onPause。如果我查看日志,它会在 onResume 后进入空闲状态。因此在调用 onResume 后立即导致 onPause。
调用方活动 - 通过意图在 onClick 上调用 MainActivity。
public class TestActivity extends AppCompatActivity implements View.OnClickListener{
String TAG = "acr";
Button testBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
testBtn = (Button) findViewById(R.id.testBtn);
testBtn.setOnClickListener(this);
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "on pause called on TestActivity ");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "on resume called on TestActivity ");
}
@Override
public void onClick(View v) { …Run Code Online (Sandbox Code Playgroud)