小编mto*_*ssi的帖子

为什么在返回父活动时始终会调用onDestroy?

我有一个非常简单的应用程序基于构建您的第一个应用程序教程.有两种活动:MainActivity调用DisplayMessageActivity通过startActivity().

进入时DisplayMessageActivity,我看到:

MainActivity.onStop()
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,但是当我按下后退按钮返回父母时MainActivity,我得到:

MainActivity.onDestroy()
MainActivity.onCreate(null)
MainActivity.onStart()
Run Code Online (Sandbox Code Playgroud)

对于这个非常简单的应用程序,活动总是被破坏.但根据文档(第二个要点),典型的行为是在这种情况下停止和重新启动活动.

此外,onDestroy()首次启动子活动时不会发生,但只会单击一次后退按钮.

两个问题:

  1. 有没有办法防止父母在常见情况下被摧毁?
  2. 为什么null被传到onCreate()这里?这阻止了我保持状态onSaveInstanceState().

请注意,我已经验证设置 - >开发者选项 - >应用 - >不要保持活动未选中.

编辑:

以下是子活动与父级链接的方式:

    <activity
        android:name="com.example.helloworld.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.helloworld.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.helloworld.MainActivity" />
    </activity>
Run Code Online (Sandbox Code Playgroud)

追踪DisplayMessageActivity.onOptionsItemSelected(),我可以看到它在呼唤Activity.onNavigateUp().

android android-lifecycle android-activity

20
推荐指数
1
解决办法
5524
查看次数

分支预测会导致非法指令吗?

在以下伪代码中:

if (rdtscp supported by hardware) {
    Invoke "rdtscp" instruction
} else {
    Invoke "rdtsc" instruction
}
Run Code Online (Sandbox Code Playgroud)

假设CPU不支持该rdtscp指令,因此我们回退到else语句.

如果CPU错误预测分支,指令管道是否可能尝试执行rdtscp并抛出Illgal Instruction错误?

assembly x86-64 cpu-architecture branch-prediction

11
推荐指数
1
解决办法
542
查看次数

使用默认的默认构造函数进行C++ 11值初始化

在以下示例中:

#include <iostream>

struct A {
    int z;
    A(std::string) {}
    A() = default;
};

int main() {
    char buf[1000];
    std::fill(buf, buf + 1000, 'x');
    auto a = new(buf) A{};
    std::cerr << "A.z: " << a->z << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

用GCC 4.8编译输出零(与Clang 3.4相同的行为).这似乎表明a在调用默认构造函数之前进行了零​​初始化.

但是根据cppreference.com上的值初始化规则,在默认构造函数调用之前不应该初始化该对象.类A符合C++ 11下的要点#1:

1)如果T是具有至少一个用户提供的任何类型构造函数的类类型,则调用默认构造函数.

另一种可能是有用的数据点是,如果我们更换A() = defaultA() {}在上面的例子中,没有零初始化发生的预期.这似乎表明在初始示例中遵循了值初始化的项目符号#2,这将是错误的:

2)如果T是没有任何用户提供的构造函数的非联合类类型,则该对象被零初始化,然后调用隐式声明的默认构造函数(除非它是微不足道的)

c++ language-lawyer c++11

7
推荐指数
1
解决办法
717
查看次数