安卓:仅在onCreate方法内使用getIntent()吗?

7
在 Android(针对 API 14-16)中,我有一个 MainActivity 和一个NextActivity。如果在 NextActivityonCreate() 块中调用 getIntent() 方法,就可以很容易地使用意图从 MainActivity 启动 NextActivity,没有任何困难。
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int data = 7;
        ...
        Intent intent = new Intent(this, NextActivity.class);
        intent.putExtra("data", data);
        startActivity(intent);
        }
    }

public class NextActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final int data = this.getIntent().getIntExtra("data", 7);
        ...
        }
    ...
    }

然而,由于字段 dataNextActivity 的匿名(“内部”)类中被使用,我被迫将其声明为 final
我不想声明字段为 final,并且通常可以避免在 onCreate() 开始之前,在类的开头声明它们。但由于某种原因,如果 getIntent() 语句(不带 final 关键字)出现在 onCreate() 之外,当 NextActivity 启动时应用程序会崩溃。
你有什么想法?

你能否发布一下崩溃的logcat日志? - iagreen
2个回答

10

onCreate()之前,你无法获取Intent--因为此时根本没有可用的Intent。我认为任何需要Context的东西也是如此。

但是,您的匿名内部类仍然可以调用getIntent(),因此您根本不需要将其声明为变量。


关于上下文的好处。变量在内部类和其他地方都需要,并且我需要能够修改它。因此,也许我应该将变量声明为非“final”,但引入第二个“final”变量来将值引入内部类。 - brannerchinese
或者在活动中将其声明为非final字段,并使用getter方法。您可以从匿名内部类内部或外部调用getData() - quietmint

1
根据您的问题,我理解的是您不想在下一个活动中将数据声明为final。那么为什么不尝试这个呢?
public class NextActivity extends Activity {
    int data=0;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         data = this.getIntent().getIntExtra("data", 7);
        ...
        }
    ...
    }

试试这个...


编译器要求类型声明;如果没有 int 就无法运行。 - brannerchinese
啊,非常好。你完美地解决了这个问题。 - brannerchinese
这是一种很好的通用方法。 - brannerchinese

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接