如果我在另一个进程的Activity上执行startActivity();是否有一种很好的方法可以在新活动真正开始的起始点(开始新活动形成后台服务)接收回调?我的意思是我可以播放,但这似乎很蹩脚。有更好的方法吗?
答案 0 :(得分:2)
基本上你要问的是ipc。谷歌了解更多信息。
要实现这一点,您需要创建一个服务类并将两个活动绑定到它。
示例Service类看起来像这样。
public class MyService extends Service{
//create a handler that will be used to handle messages
//this is just an example. Use static handlers
final Handler handler=new Handler(){
public void handleMessage(Message msg){
//I've just created a static feild.Check below.
MyFirstActivity.activity.seconActivityStarted();
}
}
//create a Messenger object
Messenger messenger=new Messenger(handler);
@Override
public IBinder onBind(Intent intent){
return messenger.getBinder()
}
}
现在事情很简单。
现在你必须将第一个活动与服务绑定。
public class MyFirstActivity extends AppCompatActivity{
//for the time being I'll just create a static field that will be used.
//you can use an interface
static MyFirstActivity activity;
//create a ServiceConnection
ServiceConnection connection=new ServiceConnection(/*contents of the service connection */);
public void onStart(){
super.onStart();
activity=this;
bindService(new Intent(this,MyService.class),connection,Context.BIND_AUTO_CREATE));
}
//following method will be called by the handler in the service
public void secondActivityStarted(){
//some code
}
//you have to handle the activity lifecycle with the bound service.
//right now its described here
}
现在是第二个活动
public class SecondActivity extends AppCompatActivity{
//create a ServiceConnection
ServiceCOnnection serviceConnection=new ServiceConnection(){
//call the handler at onServiceConnected
public void onServiceCOnnected(ComponentName name, IBinder service){
Messenger messenger=new Messenger(service);
//compose a Message object as you like
messenger.send(new Message());
}
};
//bind this activity to the same service
public void onStart(){
super.onStart();
bindService(new Intent(this,com.package.name.MySerice.class),serviceConnection,Context.BIND_AUTO_CREATE);
}
}
那就是它。根据要求进行修改。
P.S.Above提到的代码只是工作结构。
答案 1 :(得分:0)
如果对相同或其他进程中的Activity执行startActivity()(并假设第二个活动开始),则调用Activity将进入第一个PAUSED,然后进入STOPPED状态。这意味着不会处理任何回调。但是,您可以调用startActivityForResult()而不是startActivity()并接收onActivityResult()回调。
答案 2 :(得分:0)
添加一个类MyApplication,它扩展Application并在你的Manifest中提及,而不是在其中放入两个布尔变量。
private static boolean activityVisible;
public static void activityResumed() {
activityVisible = true;
}
public static void activityPaused() {
activityVisible = false;
}
public static boolean isActivityVisible() {
return activityVisible;
}
所以现在你可以在当前活动的onPause()和onStop()上执行startActivity()时调用activityPaused(),当你返回到同一个活动时,在overrideRonume()方法中调用activityResumed()
现在,通过使用MyApplication.isActivityVisible(),您可以了解您的活动是在运行还是暂停。