2012-06-09 40 views
10

我有两个Android应用程序,假设它们是“A”和“B”,“A”有五个活动,我想从“B”按钮点击事件调用它的特定活动。 我测试从另一个调用一个应用程序是这样的:Android:另一个应用程序的调用活动

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws"); 
startActivity(LaunchIntent); 

“com.testapp.ws”是“A”包名。

这会从第一次活动再次运行“A”,而不是从特定活动中运行。 我该如何拨打A的指定活动?

回答

30

格兰特,

这里的问题显然是对Android应用程序模型的误解。 Commonsware对于如何解决这个问题是绝对正确的。但是,如果不理解Android基础知识,我可以看到为什么您难以应用它。所以,快速解释:

Android中的每个操作都以Intent开始。活动尤其如此。每个活动都有一个意图。为了让开发人员可以轻松使用界面,您可以从操作系统响应Intent,或者可以从Activities类创建一个Intent以供使用。一般来说,最好的做法是做第一个选择。

响应一个Intent

当选择的意向作出回应,你可以从字面上任何意图做出回应。这被称为行动。如果我创建了一个名为“FOO”的Intent,则小节活动可以提取并响应。然而,我们有一些约定,其中主要的一点就是将你的软件包名称添加到你制作的任何意图中。例如“com.company.package.FOO”。简而言之,这是为了避免与其他应用程序发生冲突。

每个Activity都可能响应不同的事件。这是在AndroidManifest.xml中定义的。

<activity android:name="Activity3" ... > 
    <intent-filter> 
     <action android:name="com.company.package.FOO"/> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</activity> 

上面,我们还可以设置类别默认值,因此,除非用户改变它,我们会是响应我们的定制意向的唯一的应用程序。我们随后致电意图的方法是使用我们创建的同名(即“com.company.package.FOO”)

startActivity(new Intent("com.company.package.FOO")); 

这就是它是如何工作!您只需将上面的“com.company.package.FOO”更改为您的软件包名称(由您的应用程序定义)以及一些有意义的内容。一个例子是“com.testapp.ws.SWAT_FLIES”。

为什么您的代码不起作用

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws"); 

上面的代码查找意向行动的特定种类。记住,当你所做的AndroidManifest和第一活动你就把:

<action android:name="android.intent.action.MAIN"> 
<category android:name="android.intent.category.LAUNCHER"> 

嗯...... getLaunchIntentForPackage()只获取用于第一个活动的意图。这就是为什么我们要制定一个定制的意图......首先,因为我们并不真的希望它成为我们的第三个活动,我们要启动......第二,因为操作系统只会告诉我们启动活动。我们有我们自己的行动来告诉它(即“com.testapp.ws.SWAT_FLIES”)

希望这有助于

FuzzicalLogic

+0

感谢Mr.Fuzzical Logic提供的详细说明。在提到您的解释后,我已成功实施了该应用。非常感谢! – Grant

+0

如果我想将数据从一个应用程序中的一个活动发送到另一个应用程序中的服务,这将如何实现? – Aada

+0

实际上,在启动startService()之前,您只需要Intent ACTION并通过setExtra发送数据。你可能必须首先构建意图(即意图myIntent =新的意图(“com.company.app.ACTION”) –

20

第1步:添加<intent-filter>与自定义操作的第三个活动:

<intent-filter> 
    <action android:name="com.testapp.ws.SOMETHING_USEFUL"/> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

第2步:使用适当Intent启动该活动:

startActivity(new Intent("com.testapp.ws.SOMETHING_USEFUL")); 
+0

我要补充什么这里 ?? xml和Activity类中的“SOMETHING_USEFUL”?你能解释更多吗?谢谢! – Grant

+1

“类别”呢,这里有必要吗? –

+1

@ Eng.Fouad:嗯,是的,你需要一个''元素作为''中的'DEFAULT'类别 - 我的道歉。 – CommonsWare

0

有,你可以不使用两个应用程序,您的情况专门有编辑功能,或者您可能不想让定制意图,所以在这种情况下,还存在另一种(与可用性更好的错误检查):

Intent intent = new Intent(); 
intent.setClassName("PACKAGE_NAME", "PACKAGE_NAME.TARGET_ACTIVITY"); 
if (isCallable(context, intent)) { 
    // Attach any extras, start or start with callback 
} else { 
    // Respond to the application or activity not being available 
} 

某处在主类或者一个子类,手柄一般方法:

public static boolean isCallable(Activity activity, Intent intent) { 
    List<ResolveInfo> list = activity.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 
1

这里是从另一个应用程序

公共类MainActivity扩展活动{

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button bClock = (Button) findViewById(R.id.button1); 
    bClock.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
    Intent i = new Intent(Intent.ACTION_MAIN); 
    PackageManager managerclock = getPackageManager(); 
    i = managerclock.getLaunchIntentForPackage("com.whatsapp"); 
    i.addCategory(Intent.CATEGORY_LAUNCHER); 
    startActivity(i); 
    } 
    }); 

} }打开应用(例如WhatsApp的)代码

相关问题