14

「A」と「B」の2つのAndroidアプリケーションがあり、「A」には5つのアクティビティがあり、「B」のボタンクリックイベントから特定のアクティビティを呼び出したいと思います。あるアプリケーションを別のアプリケーションから呼び出すこの方法をテストしました。

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

「com.testapp.ws」は「A」のパッケージ名です。

これは、特定のアクティビティからではなく、最初のアクティビティから再び「A」を実行します。Aの指定されたアクティビティを呼び出すにはどうすればよいですか?

4

4 に答える 4

42

許す、

ここでの問題は、明らかにAndroidアプリケーションモデルの誤解です。Commonswareは、この問題を解決する方法について完全に正しいです。ただし、Androidの基本を理解していなくても、Androidの適用が難しい理由がわかります。だから、簡単な説明:

Androidのすべてのアクションは、インテントで始まります。これは特にアクティビティに当てはまります。すべてのアクティビティにはインテントがあります。開発者がインターフェイスを使いやすくするために、OSからインテントに応答するか、Activitiesクラスからインテントを作成して使用することができます。一般に、最初のオプションを実行することをお勧めします。

インテントへの対応

応答するインテントを選択するときは、文字通り任意のインテントに応答できます。これはアクションと呼ばれます。「FOO」というインテントを作成した場合、バーアクティビティはそれを取得して応答する可能性があります。ただし、規則がありますが、その主な目的は、作成したインテントの前にパッケージ名を追加することです。たとえば、「com.company.package.FOO」。簡単に言えば、これは他のアプリとの衝突を避けるためです。

すべてのアクティビティは、さまざまなイベントに応答する場合があります。これは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>

上記では、カテゴリもDEFAULTに設定しているため、ユーザーが変更しない限り、カスタムインテントに応答する唯一のアプリになります。次にインテントを呼び出す方法は、作成した同じ名前(つまり、「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()は、その最初のアクティビティのインテントのみを取得します。これが、カスタムインテントを作成する理由です...まず、スタートアップとして3番目のアクティビティにしたくないためです...次に、OSがスタートアップアクティビティのみを通知するためです。独自のアクション(つまり、「com.testapp.ws.SWAT_FLIES」)でそれを伝える必要があります

お役に立てれば、

FuzzicalLogic

于 2012-06-09T13:23:14.323 に答える
27

ステップ1:<intent-filter>カスタムアクションを使用して3番目のアクティビティにを追加します。

<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"));
于 2012-06-09T11:48:55.400 に答える
3

特に編集機能を備えた2つのアプリケーションを使用していない場合や、カスタムインテントを作成したくない場合があります。その場合は、別の方法があります(可用性のエラーチェックを改善する)。

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;
}
于 2013-08-20T20:13:54.223 に答える
1

これは、別のアプリからアプリ(例:whatsapp)を開くためのコードです

パブリッククラスMainActivityはActivity{を拡張します

/** 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);
    }
    });

}}

于 2014-01-26T07:17:42.433 に答える