一旦另一个进程中的Activity开始回调?

时间:2016-06-15 08:17:04

标签: android android-activity callback start-activity

如果我在另一个进程的Activity上执行startActivity();是否有一种很好的方法可以在新活动真正开始的起始点(开始新活动形成后台服务)接收回调?我的意思是我可以播放,但这似乎很蹩脚。有更好的方法吗?

3 个答案:

答案 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(),您可以了解您的活动是在运行还是暂停。