【问题标题】:Callback once Activity in another process has started?另一个进程中的活动启动后回调?
【发布时间】:2016-06-15 08:17:03
【问题描述】:

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

【问题讨论】:

  • 接口怎么样?
  • 你是什么意思?这是另一个过程;我该怎么办?
  • 做到这一点的方法是有一个服务。当第一个活动开始时,将其与服务绑定。在服务中创建一个处理程序(您将在创建 Messenger 对象时使用的处理程序),其中包含对其 handleMessage() 中第一个活动的接口调用。在新线程中启动的新活动上,绑定相同的服务并使用 Messenger 对象调用处理程序。因此,通信将通过 Handler 进行,数据将在 Message 对象中传输。如果您没有收到,请在此处回复。
  • 优秀的答案。请把它作为答案,以便我可以接受它作为正式答案。

标签: android android-activity callback start-activity


【解决方案1】:

基本上你问的是ipc。谷歌它以获取更多信息。

要实现这一点,您需要创建一个服务类并将两个活动绑定到它。

示例服务类如下所示。

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.上面提到的代码只是工作结构。

【讨论】:

    【解决方案2】:

    如果您在同一个或另一个进程中对 Activity 执行 startActivity()(并假设第二个 Activity 启动),则调用 Activity 将进入第一个 PAUSED,然后进入 STOPPED 状态。这意味着不会处理任何回调。但是,您可以调用 startActivityForResult() 而不是 startActivity() 并接收 onActivityResult() 回调。

    【讨论】:

    • 是的,但是我必须停止启动的活动,对吗?我希望它继续运行。
    • 根据Android设计,只有前台Activity是正在运行的Activity,后台Activity会根据系统资源需求自动推送到Stopped状态甚至销毁。
    • 我不认为你可以保持第一个 Activity 运行
    • 好吧,我错了。 Activity 实际上是从后台服务启动的。
    • 由于需要进行进程间通信,所以可以用Messengerdeveloper.android.com/guide/components/…为服务创建接口
    【解决方案3】:

    添加一个扩展 Application 的类 MyApplication 并在您的清单中提及,然后将两个布尔变量放入其中。

          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(),当您返回同一活动时,请在覆盖的 onResume() 方法中调用 activityResumed() .

    现在,通过使用 MyApplication.isActivityVisible(),您可以了解您的 Activity 是在运行还是暂停。

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 2012-04-26
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多