2012-03-30 37 views
0

我想阻止应用程序的执行(假设A),直到另一个应用程序(让我们说B)发送一个意图。我知道阻塞无限循环的线程并不好,但为了安全起见,我确实需要保证在收到Intent之前不会执行A的代码。在阻止应用程序A之前,我使用Intent启动另一个应用程序B.这样,应用程序A将有机会生存直到B完成。为此,我目前正在写了一个阻塞循环,例如:如何阻止主Android线程,直到收到一个意图?

context.startActivity(message); // starting app B 

// Blocking A 
while (condition) // waits an authorization from B 
{ 
    Thread.sleep(5000); 
    // some checks can be done here to modify the condition evaluation 
    // for example, check the Intents received from B 
} 
// (Secured zone) 
// Some code that should not be executed before that the condition is true 

我尝试了很多解决方案,以检查意向接待:

  • 使用broadcastreceiver是不可能的,因为主线程会从来没有机会处理收到的Intent
  • 使用绑定服务到另一个应用程序来获取信息:再次,onConnectedService方法将不会被调用,因为主线程不会处理该事件。
  • 使用第二个独立进程将被通知传入的意图:这很好。第二个进程被通知,但它不能通知主线程发生了什么事情!
  • 使用第二个线程来检查接收到的Intent,绑定服务到B:没办法,第二个线程不负责处理消息。

也许我缺少一个简单的解决方案,但我开始想,我试图做一些事情,与Android的理念真的很矛盾......

编辑:另一个限制是“安全区”部分代码无法在我的程序中的其他位置移动...

+1

你怎么知道何时收到意向..? – ngesh 2012-03-30 08:14:47

+0

我想你应该找到另一种防止你的代码被运行的方法。锁定主线程,用户交互以及因为系统很可能认为活动被冻结并询问用户他/她是否想要关闭活动永远不是一个好主意。 – Jave 2012-03-30 08:16:30

+0

例如,我可以使用BroadcastReceiver捕获Intent,它在第二个进程中执行onReceive方法,如果我放入清单中: JFL 2012-03-30 08:41:57

回答

0

主线程中的Thread.sleep()不是一个好主意。 您是否尝试覆盖活动A中的onNewIntent()方法以处理活动B发送的意图?

+0

我没有尝试过,但我的约束是我想避免执行应用程序A的其余代码。应用程序B向应用程序发送授权一个被允许执行代码的其余部分。如果我不阻止主线程,我相信我会成功地从B获取Intent,但是我会违反我的约束... – JFL 2012-03-30 08:54:53

+0

你不应该以这种方式阻塞主线程。我最好的建议是重新考虑你的方法。可能会使用工作线程(AsyncTask类)在后台运行任务。 – Ika 2012-04-02 08:54:46

0

它认为你应该使用另一种方法: 运行appA和appA内部,你应该做的第一件事是运行appB并且等到它的结果。 当你得到结果时,继续运行appA。

伪代码,因为我看到它:

AppA() 
{ 
    run app B; 
    if (b return needed result) 
    { 
    rest of code of AppA... 
    .... 
    .... 
    } 
} 
+0

这是我试图做的。但是不可能等待B的结果,因为应用程序A和B都将以并发方式执行。即使使用对startActivityForResult()的调用也不会阻止,因为当Android调用onActivityResult()时,结果是异步获取的。 – JFL 2012-03-30 08:51:53

0

我找到解决我的问题的丑陋的方式。在暂停应用程序A之后,应用程序A正在等待来自在不同过程中执行的B的意图。然后,当这个进程收到来自B的消息时,它将信息写入文件。 A thas的主线程被阻塞到循环中,定期读取文件。当文件包含预期的信息时,条件变为false并且线程被解除阻塞。

在细节,它提供了:

到应用程序答:

Thread.sleep(1000); 

context.startActivity(message); // starting app B 

// Blocking A 
while (!auth) // waits an authorization from B 
{ 

try { 
    FileInputStream fIn = c.openFileInput("authorization.txt"); 
    InputStreamReader isr = new InputStreamReader(fIn); 
    char buf[] = new char[1]; 
    isr.read(buf); 
    String res = new String(buf); 
    isr.close(); 

    if (res.equals("1")) 
    { 
    auth = true; 
    System.out.println("READ OK"); 
    } 
} 

在应用程序A,广播接收器应该在清单中声明了Android:过程标签 “:P2”:

<receiver android:name="reporter.ReporterReceiver" android:process=":p2"> 
    <intent-filter> 
    <action android:name="andro.jf.reporterResponse" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</receiver> 

和接收器应该是:

public class ReporterReceiver extends BroadcastReceiver { 

public void onReceive(Context context, Intent intent) { 
    Bundle extra = intent.getExtras(); 

    System.out.println("ANSWER RECEIVED"); 

    if (extra != null) 
    { 
    String auth = extra.getString("authorization"); 
    //Reporter.authorization = contact; 

    // Write the string to the file 
    try { 
     FileOutputStream fOut = context.openFileOutput("authorization.txt", Context.MODE_PRIVATE); 
     OutputStreamWriter osw = new OutputStreamWriter(fOut); 
     osw.write(auth); 
     osw.flush(); 
     osw.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 
} 
} 

我知道,这是丑陋的......但它起作用,至少在模拟器中。

相关问题