添加到包而不提取它
add to bundle without extract it
我有两个 class。 class A 和 class B。在classA中,我将一些字符串放入一个bundle对象中,然后将其发送到classB。
我的问题在这里:
我可以直接将一些 string
或 int
放入此捆绑包而不将其提取到 class B 中并向其添加额外信息,然后创建一个新捆绑包。
*********编辑*******
其他场景:
我已经从意图服务发送了一个包到 activity 然后在 activity 我想给这个包添加一些额外的东西,最后我将这个包发送到后台线程以节省 sharePreference .我该怎么做?
是的,你可以做到。所以在你的 Class B 中,当你想打开 Class C 时,你可以从以前的意图中获取包,然后继续添加到同一个包并打开 C
Intent newIntent = new Intent(ActivityB.this, ActivityC.class);
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
bundle.putString("newKey","newValue");
newIntent.putExtras(bundle);
}
startActivity(newIntent);
更新
因为您想在 BG 线程中传递此 Bundle 并假设您正在使用 AsyncTask,您可以执行以下操作 -
如下声明您的异步任务 -
class MyBGClass extends AsyncTask<Bundle,Void,Void>{
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Bundle... params) {
return null;
}
}
然后你可以调用它 -
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
bundle.putString("newKey","newValue");
}
new MyBGClass().execute(bundle);
更新 2:
从您的 resultReceiver 传递数据 -
receiver.send(RESULT_CODE, bundle);
然后在您的 activity 中,您可以将此结果接收器传递给您的服务工具
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
//resultData is your bundle. to add to it -
if (resultData != null) {
resultData.putString("newKey","newValue");
}
}
然后调用你的BG线程。
像下面这样更改 WorkerThread class 的构造函数,并在创建 class-
的对象时将 bundle 传递给线程
private class WorkerThread extends HandlerThread {
private static final int SAVE = 1;
PreferenceModel instancePreferenceModel;
Bundle bundle;
private Handler mHandler;
public WorkerThread(Bundle bundle) {
super("WorkerThread", Process.THREAD_PRIORITY_BACKGROUND);
App app = (App) getApplication();
this.bundle = bundle;
instancePreferenceModel = app.getInstancePreferenceModel();
}
@Override
protected void onLooperPrepared() {
super.onLooperPrepared();
mHandler = new Handler(getLooper()) {
@Override // receive message from uiThread as Bundle object.
public void handleMessage(Message msg) {
switch (msg.what) {
case SAVE:
Log.i(TAG, "handleMessage: saved completed");
Bundle data = (Bundle) msg.obj;
Log.i(TAG, "getData: " + data.getString(LoginIntentService.EXTRA_FIRST_NAME));
instancePreferenceModel.saveUserInfo(data);
break;
}
}
};
}
// this method is access to main ui thread.by this method UiThread can send a Message
// Background Thread
public void write(Bundle b) {
Message msg = new Message();
msg.obj = b;
Message obtain = Message.obtain(mHandler, SAVE, msg.obj);
mHandler.sendMessage(obtain);
}
}
我有两个 class。 class A 和 class B。在classA中,我将一些字符串放入一个bundle对象中,然后将其发送到classB。
我的问题在这里:
我可以直接将一些 string
或 int
放入此捆绑包而不将其提取到 class B 中并向其添加额外信息,然后创建一个新捆绑包。
*********编辑******* 其他场景:
我已经从意图服务发送了一个包到 activity 然后在 activity 我想给这个包添加一些额外的东西,最后我将这个包发送到后台线程以节省 sharePreference .我该怎么做?
是的,你可以做到。所以在你的 Class B 中,当你想打开 Class C 时,你可以从以前的意图中获取包,然后继续添加到同一个包并打开 C
Intent newIntent = new Intent(ActivityB.this, ActivityC.class);
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
bundle.putString("newKey","newValue");
newIntent.putExtras(bundle);
}
startActivity(newIntent);
更新
因为您想在 BG 线程中传递此 Bundle 并假设您正在使用 AsyncTask,您可以执行以下操作 -
如下声明您的异步任务 -
class MyBGClass extends AsyncTask<Bundle,Void,Void>{
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Bundle... params) {
return null;
}
}
然后你可以调用它 -
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
bundle.putString("newKey","newValue");
}
new MyBGClass().execute(bundle);
更新 2: 从您的 resultReceiver 传递数据 -
receiver.send(RESULT_CODE, bundle);
然后在您的 activity 中,您可以将此结果接收器传递给您的服务工具
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
//resultData is your bundle. to add to it -
if (resultData != null) {
resultData.putString("newKey","newValue");
}
}
然后调用你的BG线程。
像下面这样更改 WorkerThread class 的构造函数,并在创建 class-
的对象时将 bundle 传递给线程private class WorkerThread extends HandlerThread {
private static final int SAVE = 1;
PreferenceModel instancePreferenceModel;
Bundle bundle;
private Handler mHandler;
public WorkerThread(Bundle bundle) {
super("WorkerThread", Process.THREAD_PRIORITY_BACKGROUND);
App app = (App) getApplication();
this.bundle = bundle;
instancePreferenceModel = app.getInstancePreferenceModel();
}
@Override
protected void onLooperPrepared() {
super.onLooperPrepared();
mHandler = new Handler(getLooper()) {
@Override // receive message from uiThread as Bundle object.
public void handleMessage(Message msg) {
switch (msg.what) {
case SAVE:
Log.i(TAG, "handleMessage: saved completed");
Bundle data = (Bundle) msg.obj;
Log.i(TAG, "getData: " + data.getString(LoginIntentService.EXTRA_FIRST_NAME));
instancePreferenceModel.saveUserInfo(data);
break;
}
}
};
}
// this method is access to main ui thread.by this method UiThread can send a Message
// Background Thread
public void write(Bundle b) {
Message msg = new Message();
msg.obj = b;
Message obtain = Message.obtain(mHandler, SAVE, msg.obj);
mHandler.sendMessage(obtain);
}
}