【问题标题】:Calling an activity from Service passing String data从传递字符串数据的服务调用活动
【发布时间】:2012-10-25 19:17:15
【问题描述】:

我想从 Android 中的 Service 调用 Activity A(并将一些字符串传递给它)。这个活动 A 反过来用 startActivityForResult(). 调用另一个活动 B 基本上,我希望我的服务等到获得活动 B 的结果。请给我一些关于如何完成这个实现的想法(以及在意图中设置哪个标志)?

服务

Intent intent = new Intent(getBaseContext(),ActivityA.class);       
intent.putExtra("code",script);
intent.putExtra("type", type);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

活动A

Intent intent = new Intent(this,ActivityB.class);
intent.putExtra("code",code);
intent.putExtra("type", type);      
startActivityForResult(intent,REQUEST_CODE); 

【问题讨论】:

  • 在服务中使用/注册BroadcastReciver,然后如果你从ActivityB返回到ActivityA(在ActivityAonActivityResult中)发送广播(Context.sendBroadcast)...然后@服务中注册的987654330@应该做来自onRecive的代码)
  • 感谢您的回复。但是我的活动 A 没有从服务中调用。我应该设置什么标志。您能否提供一些相同的示例链接(使用 BroadCastReceiver)? @塞尔文
  • 第一 - Intent.FLAG_ACTIVITY_NEW_TASK 足以从服务启动 Activity,第二 - 你不能强制服务等到 Activity 返回,这就是你应该使用 BroadcastReciver 的原因,第三有很多关于接收器的教程,但你应该了解它们的工作原理
  • @Selvin 提议对我来说看起来不错。但是,您为什么要在 Activity B 中执行长时间操作?对我来说,在 Service 中执行它似乎更干净(如果它可以减慢渲染速度,还有一个单独的线程)。
  • @Teovald 因为我不能在服务中使用 startActivityForResult(),所以我要添加一个额外的 Activity。

标签: android android-activity android-service


【解决方案1】:

首先创建一个接口

public interface MyActions {
public void doActions();
}

现在让您的服务类实现该接口

public class MyService extends Service implements MyActions{

并重写方法

@Override
public void doActions() {
    //Some code
}

现在您的 Activity A 正在通过 startActivityForResult 方法调用 B,因此请覆盖 A 的 onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //Some code
}

现在在这个A类中创建接口的静态实例

static MyActions mActions;

现在写一个像这样的静态方法

public static void setMyListener(MyActions act){
    mActions = act;
}

现在在您为 A 类覆盖的 onActivityResult 中添加这行代码

mActions.doActions();

所以你得到

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mActions.doActions();
}

现在在 onStart() 方法中的 Service 类中,在调用活动之前写下这一行

ActA.setMyListener(this);

当从 Activity B 调用转到 A 的 onActivityResult 并且从 A 服务可以监听 doActions() 的覆盖方法时,现在就完成了

在 doActions() 服务方法中编写您想要执行的所有代码

这里是代码

第一个活动:ActA.java

public class ActA extends Activity {
static MyActions mActions;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.act1);
    Button btn = (Button) findViewById(R.id.button1);
    btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            startActivityForResult(new Intent(ActA.this,ActB.class), 15);
        }
    });
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d("Response","requestCode" + requestCode + " resultCode" + resultCode);
    mActions.doActions();
}

public static void setMyListener(MyActions act){
    mActions = act;
}
}

第二个活动:ActB.java

public class ActB extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.act2);
}
}

应用启动时的 MainActivity

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Start the service
    startService(new Intent(this, MyService.class));
}
}

接口:MyActions.java

public interface MyActions {
public void doActions();
}

服务类:MyService.java

public class MyService extends Service implements MyActions{


@Override
public IBinder onBind(Intent arg0) {
    return null;
}

public void onStart(Intent intent, int startId) {

    super.onStart(intent, startId);
    Log.d("Response", "Started");
    ActA.setMyListener(this);
    startActivity(new Intent(this,ActA.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}

@Override
public void doActions() {
    Log.d("Response", "Listener working");
}

}

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多