标签: android-lifecycle

每当调用startactivityforresult时,Android都会杀死我的应用程序

好吧,在我的应用程序中,我正在使用Android的默认摄像头和图库,其中startActivityforResult为;

Intent i = new Intent("android.intent.action.PICK",
                       MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
i.setType("image/*");
startActivityForResult(i, this.SELECT_PICTURE);
Run Code Online (Sandbox Code Playgroud)

我也能够捕获onActivityResult.但是,如果内存很少并且我开始这个活动,我经历过该系统正在杀死我的父活动,即使活动返回一个值,我也丢失了所有的局部变量(并再次调用onCreate()).只应再次调用onResume().

我试了几次,我很确定它与内存问题有关.如果有足够的内存进程成功执行.我该如何防止这种行为?

由于Android不会在前台杀死应用程序,我还可以使用此功能吗?我认为我的问题与问题几乎相似.


除了Yahel提供的解决方案之外,使用以下方法也可以.

@Override
public void onSaveInstanceState(Bundle savedInstanceState){
   super.onSaveInstanceState(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
   super.onRestoreInstanceState(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)

android android-intent android-lifecycle android-activity

2
推荐指数
1
解决办法
3648
查看次数

为什么我的Activity泄漏了?

我有一个具有IntentFilter和BroadcastReceiver的Activity,我将它们注册到我的onCreate().

IntentFilter filter = new IntentFilter(ACTION_RCV_MESSAGE);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new MessageReceiver();
registerReceiver(receiver, filter);
Run Code Online (Sandbox Code Playgroud)

但在结束我的应用程序时,Logcat说:

07-03 01:38:19.567:ERROR/ActivityThread(304):android.app.IntentReceiverLeaked:Activity com.intentservicetest5.IntentServiceTest5Activity泄露了最初在这里注册的IntentReceiver com.intentservicetest5.IntentServiceTest5Activity$MessageReceiver@44efe8a8.你是否错过了对unregisterReceiver()的调用?

但我确实有

public void onDestroy(Bundle savedInstanceState){
    unregisterReceiver(receiver);
}
Run Code Online (Sandbox Code Playgroud)

当我打电话时,为什么我的活动仍在泄露unregisterReceiver()

android broadcastreceiver android-lifecycle android-activity

2
推荐指数
1
解决办法
3307
查看次数

Android后退按钮和恢复活动

我有这个问题.
我有一个动作A启动其他活动B(通过onclick - 按钮).
我有一个后退按钮回来活性一个.我按它.
现在我在A,我再按一次按钮转到B.

如果我使用android后退按钮(我在B中)我首先回到A然后再回到B.
但是现在,如果我再次按下android后退按钮,我不会去A的previus活动或者它从app退出.我回到B !!!

我该如何防止这种行为?

android android-lifecycle android-activity

2
推荐指数
1
解决办法
3125
查看次数

将数据发送到onBackPressed上的父活动

有没有办法在按下后退时将更新的数据发送到父活动?我想更新捆绑包中的数据,但我不知道如何访问它.

例如,我有一个图库活动,可以打开图像查看器.假设用户滚动了十几个图像,然后退回到图库.使用他们查看的最后一张图像更新图库中的焦点图像是理想的.

目前,如果没有全球化的设置,我无法想到如何做到这一点.

这是我想做的伪代码(虽然这显然不起作用):

儿童:

@Override
public void onBackPressed() {
    getIntent().setData(currentImage);  // Not the right intent, obviously
    super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)

家长:

@Override
public void onResume()
{
    super.onResume();
    Uri photoFocus = getIntent().getData();
    if (photoFocus != null)
        setPhotoFocus(photoFocus);
}
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle android-activity

2
推荐指数
1
解决办法
8189
查看次数

片段或活动停止后停止所有事件

我遇到一个片段中有两个可点击项的情况。项目A将当前片段与当前活动分离,并附加一个新片段。项目B导致一些UI更新。我的问题是,如果我快速连续单击它们两者,则应用程序崩溃。我在UI更新中得到了NullPointerException,因为显然该片段已经与项目A分离了。更直观的日志表示形式:

  1. 点击项目B
  2. 此后不久单击项目A
  3. 项A导致当前片段分离,并最终导致调用onDestroyView。
  4. 项B尝试在大约150毫秒后更新UI,但是UI元素现在为空,因为onDestroyView已经执行,从而导致NPE。

我正在使用运行4.2.2的Nexus 4。我正在使用Dagger进行依赖项注入,我认为这可能是问题的根源,但我在整个应用程序中看到了类似的边缘情况,其中几乎可以同时单击两件事,而崩溃问题有时会发生。没有注射。在每种情况下,这两种操作都将以看似未定义的顺序发生,这将导致奇怪的行为并崩溃。

有没有办法停止onStop或onDestroyView中的所有后续事件或飞行事件?还是我需要向每个UI侦听器中添加一个isDetached()检查?我还尝试在onDestroy中分离所有侦听器,从而消除了部分但并非全部崩溃。似乎我有一个与此未解决的问题类似的问题:在onDestroyView之后调用Fragment的OnClickListener

android android-lifecycle

2
推荐指数
1
解决办法
1479
查看次数

Android - 如何检测堆栈中的最终Activity

我使用下面的代码检查最后Fragment一个Activity以弹出一个对话框

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // Check if there is only one fragment
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
                DlgUniversalError.shallIQuit(this, getApplicationContext()
                        .getResources().getString(R.string.doYouWantToQuit),
                        getSupportFragmentManager());
                return false;
            }
        }
        return super.onKeyDown(keyCode, event);
    }
Run Code Online (Sandbox Code Playgroud)

现在假设我有一套Activitys.如何Activity判断Activity堆栈中是否为最后一个,并弹出退出对话框?

android android-lifecycle android-activity back-stack android-task

2
推荐指数
1
解决办法
3467
查看次数

Application.ActivityLifecycleCallbacks是否在Activity中的生命周期方法之前同步调用?

我继承了一些使用Application.ActivityLifecycleCallbacks的漂亮代码.我们正在使用该onActivityResumed方法在用户的会话超时时将用户带回登录屏幕.

API文档中没有关于其工作原理的文档.我们是否可以保证何时调用这些方法(即它们onResume是否在Activity中相应的方法之前调用),以及它们是否与正常的生命周期方法同步?

如果我不得不猜测,我会假设这些并行发生,这意味着个别活动/片段仍然需要安全地应对被注销.

android android-lifecycle android-activity

2
推荐指数
1
解决办法
1266
查看次数

按下按钮SplashScreen退出并打开身份验证活动

当我启动应用程序时,我创建了两个Activity"SplashActivity和AuthenticationActivity",它将SplashScreen加载5秒并转移到AuthenticationActivity.现在我的问题是,当我运行应用程序时,它加载splashScreen,但在5秒内,当我点击后退按钮SplashActivity退出并立即AuthenticationActivity出现在前台.如何编码当我点击后退按钮我的应用程序应退出.我试过的代码如下

public class SplashActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    Thread splashTimer = new Thread(){


        public void run(){
            try{
                sleep(5000);
                startActivity(new Intent(SplashActivity.this,AuthenticationActivity.class));
                finish();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                finish();
            }
        }

    };
    splashTimer.start();
}

@Override
public void onBackPressed() {
    super.onBackPressed();

}

@Override
protected void onPause() {
    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();

}}
Run Code Online (Sandbox Code Playgroud)

android splash-screen android-lifecycle

2
推荐指数
1
解决办法
1203
查看次数

CountDownTimer不在onResume()中启动

我在片段中使用CountDownTimer。我希望计时器在应用程序进入后台时暂停,并在用户回来时恢复计时。正如其他SO问题所建议的那样,我取消了托管活动的onPause()中的计时器,并从同一时间点开始维护了onResume()中的新计时器(保持了静态变量millisLeft)。

我不知道为什么,但是onResume()中的计时器未再次启动(我尝试登录onResume(),但未显示任何日志,这意味着计时器从未启动)。请帮助我。谢谢。

public class MainFragment extends Fragment implements NavigationView.OnNavigationItemSelectedListener {

    private View rootView;
    private ComprehensionDb db;
    CountDownTimer countDownTimer;
    static long millisLeft;
    TextView timer;

    public static Fragment newInstance() {
        return new MainFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.main, container, false);
        Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
        toolbar.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorPrimary_comprehension));
        toolbar.inflateMenu(R.menu.menu_main_white);

        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.action_about:
                        AlertDialog.Builder builder =
                                new AlertDialog.Builder(getActivity());
                        builder.setTitle(String.format("%1$s", getString(R.string.comprehension_about_us)));
                        builder.setMessage(getResources().getText(R.text));
                        builder.setPositiveButton("OK", null);
                        AlertDialog …
Run Code Online (Sandbox Code Playgroud)

android timer android-lifecycle countdowntimer

2
推荐指数
1
解决办法
211
查看次数

activity完成了自己,但onDestroy()调用此活动发生得太晚了

我在代码中发现了一个错误,我们正在启动活动(让我们将其称为SCREEN_ACTIVITY)

Intent intent = new Intent(SharedIntents.INTENT_SCREEN);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

Android文档:使用FLAG_ACTIVITY_NEW_TASK时,如果任务已在您正在启动的活动上运行,则不会启动新活动; 相反,当前任务将简单地以最后一个状态被带到屏幕的前面.

所以在大多数情况下一切正常.

当用户点击某些内容时,该屏幕活动将调用finish().此屏幕活动也将通过服务的传入事件启动或创建.

6053 I/ScreenActivity(15395): onCreate
6682 E/ScreenActivity(15395): finish() Activity
6832 I/ScreenActivity(15395): onDestroy

7284 I/ScreenActivity(15395): onCreate
7911 E/ScreenActivity(15395): finish() Activity
8063 I/ScreenActivity(15395): onDestroy

10555 I/ScreenActivity(15395): onCreate
13413 E/ScreenActivity(15395): finish() Activity
13701 I/ScreenActivity(15395): onCreate
13799 I/ScreenActivity(15395): onDestroy
Run Code Online (Sandbox Code Playgroud)

最后一个是问题.创建ScreenActivity,然后调用finish()本身.但问题是onDestroy被称为很晚.在此之前,来自服务器的传入事件和调用startActivity()会触发一个新的ScreenAcitivty onCreate().问题是ScreenManager类保留了创建和销毁该活动的标志.

在onCreate()回调和onDestroy()回调时设置该标志.因此,对于第10555行和第13701行,ScreenManager设置createFlag = true.对于13799行,设置createFlag = false.在13799行假定未创建活动且未向活动通知事件之后,事件发生.

希望我对此问题的描述清楚.调用finish()后会发生这种情况onStop()和onDestroy()调用这么晚吗?如果是的话,我必须考虑解决方案.如果没有,那么有什么地方可以修改吗?

非常感谢.

android android-lifecycle

2
推荐指数
1
解决办法
2311
查看次数