activity 到 activity 回调侦听器
activity to activity callback listener
假设有 2 个活动 Activity1
和 Activity2
。我需要从 methodAct2
(在 Activity2
内)调用方法 methodAct1()
(在 Activity1
内)。我认为它应该使用回调侦听器工作 - 我不想使用 EventBus
库!
我使用此代码得到 java.lang.NullPointerException
:
接口:
public interface MyListener {
public void listen();
}
Activity 创建事件的位置:
public class Activity2 extends Activity {
private MyListener myListener;
public void setUpListener(MyListener myListener) {
this.myListener = myListener;
}
private void doWork(){
//do stuff
myListener.listen();
}
}
Activity 我希望在完成工作后获得该事件:
public class Activity1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Activity2 activity2 = new Activity2();
activity2.setUpListener(new setUpListener() {
@Override
public void listen() {
// get the event here
}
});
}
}
NPE 的发生是因为你的陈述:
Activity2 activity2 = new Activity2(); <--
你不应该这样做,而应该在 Activity 1:
Intent intent = new Intent(this, Activity2.class);
intent.putExtra("dataKey", "dataValue");
startActivityForResult(pickContactIntent, CALLBACK_REQUEST);
startActivityForResult() 提供从 Activity 2 到 Activity 1 的回调,您必须覆盖结果在 activity 1:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
if (requestCode == CALLBACK_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// The Intent's data Uri identifies which contact was selected.
// Do something with the contact here (bigger example below)
}
}
}
这是绝对不可能的。您永远不会自己实例化一个新的 Activity。您不会同时有两个活动 运行。
如果你希望另一个 Activity 做某事,基于你之前的 Activity 想要的,那么你需要将其添加到你的 Intent 中。
Intent intent = new Intent(this, Activity2.class);
intent.putExtra("data field", "data value");
startActivity(intent);
如果您希望通过回调实现特定功能,那么您可能会考虑 Fragments。这样,你可以拥有相同的 Activity 运行 并且它可以告诉各个 Fragment 需要做什么。
你可以这样做 >
- 第 01 步:实现共享接口
public interface SharedCallback {
public String getSharedText(/*you can define arguments here*/);
}
- 第 02 步:实施共享 class
final class SharedMethode {
private static Context mContext;
private static SharedMethode sharedMethode = new SharedMethode();
private SharedMethode() {
super();
}
public static SharedMethode getInstance() {
return sharedMethode;
}
public void setContext(Context context) {
if (mContext != null)
return;
mContext = context;
}
public boolean contextAssigned() {
return mContext != null;
}
public Context getContext() {
return mContext;
}
public void freeContext() {
mContext = null;
}
}
- 第 03 步 :: 先玩代码 Activity
public class FirstActivity extends Activity implements SharedCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
// call playMe from here or there
playMe();
}
private void playMe() {
SharedMethode.getInstance().setContext(this);
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
}
@Override
public String getSharedText(/*passed arguments*/) {
return "your result";
}
}
- 第 04 步 :: 在第二阶段完成游戏Activity
public class SecondActivity extends Activity {
private SharedCallback sharedCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
if (SharedMethode.getInstance().contextAssigned()) {
if (SharedMethode.getInstance().getContext() instanceof SharedCallback)
sharedCallback = (SharedCallback) SharedMethode.getInstance().getContext();
// to prevent memory leak. no further needs
SharedMethode.freeContext();
}
// You can now call your implemented methodes from anywhere at any time
if (sharedCallback != null)
Log.d("TAG", "Callback result = " + sharedCallback.getSharedText());
}
@Override
protected void onDestroy() {
sharedCallback = null;
super.onDestroy();
}
}
您还可以实现反向词回调(从 First 到 Second)以从 SecondAvtivity 获取一些结果或调用一些方法
你可以像这样用你的方法做到这一点....
public class Activity2 extends AppCompatActivity {
private static MyListener myListener;
public static void setUpListener(MyListener Listener) {
myListener = Listener;
}
public void doWork(View view) {
myListener.listen();
}
}
public class Activity1 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Activity2.setUpListener(new MyListener() {
@Override
public void listen() {
Log.d("Hello", "Hello World");
}
});
}
public void goToAnotherActivity(View view) {
startActivity(new Intent(Activity1.this, Activity2.class));
}
}
尽管这不是最佳方法,但为了使用此机制,您需要创建 activity1。
假设有 2 个活动 Activity1
和 Activity2
。我需要从 methodAct2
(在 Activity2
内)调用方法 methodAct1()
(在 Activity1
内)。我认为它应该使用回调侦听器工作 - 我不想使用 EventBus
库!
我使用此代码得到 java.lang.NullPointerException
:
接口:
public interface MyListener {
public void listen();
}
Activity 创建事件的位置:
public class Activity2 extends Activity {
private MyListener myListener;
public void setUpListener(MyListener myListener) {
this.myListener = myListener;
}
private void doWork(){
//do stuff
myListener.listen();
}
}
Activity 我希望在完成工作后获得该事件:
public class Activity1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Activity2 activity2 = new Activity2();
activity2.setUpListener(new setUpListener() {
@Override
public void listen() {
// get the event here
}
});
}
}
NPE 的发生是因为你的陈述:
Activity2 activity2 = new Activity2(); <--
你不应该这样做,而应该在 Activity 1:
Intent intent = new Intent(this, Activity2.class);
intent.putExtra("dataKey", "dataValue");
startActivityForResult(pickContactIntent, CALLBACK_REQUEST);
startActivityForResult() 提供从 Activity 2 到 Activity 1 的回调,您必须覆盖结果在 activity 1:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
if (requestCode == CALLBACK_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// The Intent's data Uri identifies which contact was selected.
// Do something with the contact here (bigger example below)
}
}
}
这是绝对不可能的。您永远不会自己实例化一个新的 Activity。您不会同时有两个活动 运行。
如果你希望另一个 Activity 做某事,基于你之前的 Activity 想要的,那么你需要将其添加到你的 Intent 中。
Intent intent = new Intent(this, Activity2.class);
intent.putExtra("data field", "data value");
startActivity(intent);
如果您希望通过回调实现特定功能,那么您可能会考虑 Fragments。这样,你可以拥有相同的 Activity 运行 并且它可以告诉各个 Fragment 需要做什么。
你可以这样做 > - 第 01 步:实现共享接口
public interface SharedCallback {
public String getSharedText(/*you can define arguments here*/);
}
- 第 02 步:实施共享 class
final class SharedMethode {
private static Context mContext;
private static SharedMethode sharedMethode = new SharedMethode();
private SharedMethode() {
super();
}
public static SharedMethode getInstance() {
return sharedMethode;
}
public void setContext(Context context) {
if (mContext != null)
return;
mContext = context;
}
public boolean contextAssigned() {
return mContext != null;
}
public Context getContext() {
return mContext;
}
public void freeContext() {
mContext = null;
}
}
- 第 03 步 :: 先玩代码 Activity
public class FirstActivity extends Activity implements SharedCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
// call playMe from here or there
playMe();
}
private void playMe() {
SharedMethode.getInstance().setContext(this);
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
}
@Override
public String getSharedText(/*passed arguments*/) {
return "your result";
}
}
- 第 04 步 :: 在第二阶段完成游戏Activity
public class SecondActivity extends Activity {
private SharedCallback sharedCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
if (SharedMethode.getInstance().contextAssigned()) {
if (SharedMethode.getInstance().getContext() instanceof SharedCallback)
sharedCallback = (SharedCallback) SharedMethode.getInstance().getContext();
// to prevent memory leak. no further needs
SharedMethode.freeContext();
}
// You can now call your implemented methodes from anywhere at any time
if (sharedCallback != null)
Log.d("TAG", "Callback result = " + sharedCallback.getSharedText());
}
@Override
protected void onDestroy() {
sharedCallback = null;
super.onDestroy();
}
}
您还可以实现反向词回调(从 First 到 Second)以从 SecondAvtivity 获取一些结果或调用一些方法
你可以像这样用你的方法做到这一点....
public class Activity2 extends AppCompatActivity {
private static MyListener myListener;
public static void setUpListener(MyListener Listener) {
myListener = Listener;
}
public void doWork(View view) {
myListener.listen();
}
}
public class Activity1 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Activity2.setUpListener(new MyListener() {
@Override
public void listen() {
Log.d("Hello", "Hello World");
}
});
}
public void goToAnotherActivity(View view) {
startActivity(new Intent(Activity1.this, Activity2.class));
}
}
尽管这不是最佳方法,但为了使用此机制,您需要创建 activity1。