Android Intent传值:NoteActivity到MainActivity的addNote()收不到数据
问题分析与解决方案
你遇到的问题根源有两个:
addNote()方法从未被触发执行:你的代码里定义了addNote(),但没有任何地方调用这个方法,所以里面获取Intent数据的逻辑根本没机会运行。- Intent的生命周期绑定问题:当你从
NoteActivity通过startActivity(intent)启动MainActivity时,系统默认会创建MainActivity的新实例(除非指定特殊启动模式)。如果addNote()不是在这个新实例的生命周期流程里被调用,它拿到的getIntent()是启动MainActivity时的原始Intent,而非从NoteActivity传过来的新Intent。
下面提供两种可行的解决方案:
方案一:在onCreate()中处理Intent并调用addNote()
直接在MainActivity的onCreate()里接收Intent数据,再传给addNote()处理,这是最直接的方式:
修改MainActivity代码:
public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private RecyclerView.Adapter mAdapter; private RecyclerView.LayoutManager layoutManager; ArrayList<String> notes = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); notes.add("sql"); // 处理从NoteActivity传来的Intent数据 Intent receivedIntent = getIntent(); if (receivedIntent.hasExtra(NotePad.EXTRA_MESSAGE)) { String title = receivedIntent.getStringExtra(NotePad.EXTRA_MESSAGE); addNote(title); // 别忘了通知适配器数据更新,否则RecyclerView不会刷新 mAdapter.notifyDataSetChanged(); } } // 修改addNote方法,直接接收标题参数,无需自己获取Intent void addNote(String title) { notes.add(title); Log.d("Data","inside saveData"); Log.d("Data","title: "+title); } }
方案二:使用singleTop启动模式复用MainActivity实例
如果你不想每次都创建MainActivity的新实例,可以设置启动模式为singleTop,然后在onNewIntent()中处理新的Intent:
第一步:修改AndroidManifest.xml中MainActivity的配置
<activity android:name=".MainActivity" android:launchMode="singleTop"> <!-- 添加这行 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
第二步:修改MainActivity代码
public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private RecyclerView.Adapter mAdapter; private RecyclerView.LayoutManager layoutManager; ArrayList<String> notes = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); notes.add("sql"); // 处理首次启动的Intent(可选) handleIntent(getIntent()); } // 重写onNewIntent处理新的Intent @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); // 更新当前实例的Intent为新Intent handleIntent(intent); } // 统一处理Intent的方法 private void handleIntent(Intent intent) { if (intent.hasExtra(NotePad.EXTRA_MESSAGE)) { String title = intent.getStringExtra(NotePad.EXTRA_MESSAGE); addNote(title); mAdapter.notifyDataSetChanged(); } } void addNote(String title) { notes.add(title); Log.d("Data","inside saveData"); Log.d("Data","title: "+title); } }
额外提醒
不管用哪种方案,添加新笔记后一定要调用mAdapter.notifyDataSetChanged(),否则RecyclerView不会刷新显示新的数据。
内容的提问来源于stack exchange,提问作者shaswat kumar
相关产品推荐
相关产品推荐

