3

アプリで新しいインテントを開始する方法を見つけようとして、それを表現するいくつかの方法に出くわしました。

この構文は、ランタイムエラー、つまりActivityNotFound例外を返します。

Intent in = new Intent("com.something.something"); 

もちろん、私のAndroidマニフェストにはインテントフィルター内のアクションが含まれています。

<activity
        android:name=".SecondActivity"
        android:label="@string/title_activity_second" >
        <intent-filter>
            <action android:name="com.something.something" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity> 

このフォーマットは機能します:

Intent in = new Intent(MainActivity.this, SecondActivity.class); 

私も次のことを試しました:

Intent in = new Intent(this, SomeActivity.class); 

それは私が読んでいる本で推薦されました。これは実行時エラー、activitynotfoundを返します

これにより、EclipseはsetClassとsetClassNameの間を無限に行き来します。

 Intent in = new Intent().setClass(this, SecondActivity.class);

私はそれをonclickメソッドで使用しています:

ok.setOnClickListener(new View.OnClickListener()
    {

        @Override
        public void onClick(View v)
        {

            Intent in = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(in);
        }
    });
}

これらの違いは何ですか?なぜそれらの1つだけが私のために働いているのですか?

よろしく/M

4

2 に答える 2

11

インテント解決に関する基本情報

インテントには、次の基本情報を含めることができます。

  • アクション
  • カテゴリー
  • データ
  • 成分

インテントがシステムによって解決される2つの方法があります。

  • 明示的(指定されている場合はCOMPONENTを使用します)
  • 暗黙的(適切なアクティビティを見つけるためにACTION、CATEGORY、およびDATAを使用します)

コンポーネント(パッケージ名とクラス名)を指定すると、これを使用して指定したアクティビティが明示的に検索され、インテントがそのアクティビティに送信されます。他のインテントデータは使用されません(ただし、インテント内の呼び出されたアクティビティに渡されます)。これは「明示的なインテント解決」と呼ばれます。

コンポーネントを指定しない場合は、ACTION、CATEGORY、およびDATAフィールドを使用して、インテントを受け入れることができることを(インテントフィルターを介して)アドバタイズする1つ以上のアクティビティを検索します。これは「暗黙のインテント解決」と呼ばれます。


あなたの特定の質問に

これを行うとき:

Intent in = new Intent("com.something.something");

暗黙のインテントを作成し、ACTIONを「com.something.something」に設定しています。startActivity()その後、このインテントで呼び出すとActivityNotFoundException、AndroidはACTION="com.something.something"でインテントを受け入れることができるアクティビティを見つけることができないために取得します。その理由は、ACTION="com.something.something"とCATEGORY="android.intent.category.LAUNCHER"でインテントフィルターを提供したが、インテントでCATEGORYを指定していないためです(Androidは自動的にCATEGORYを追加します)を使用するときにCATEGORYが指定されていない場合は、インテントに「DEFAULT」しますstartActivity()。この作業を行うには、次のいずれかを行う必要があります

  • またはCATEGORY="android.intent.category.LAUNCHER"に置き換えますCATEGORY="android.intent.category.DEFAULT"
  • 追加<category android:name="android.intent.category.DEFAULT" />

インテントフィルターにSecondActivity


これを行うとき:

Intent in = new Intent(MainActivity.this, SecondActivity.class);

コンポーネントを指定する明示的なインテントを作成していますSecondActivity。このメソッドのシグネチャはですIntent(Context packageContext, Class clas)。fromのパッケージ名packageContextとfromのクラス名clasを使用して、そのコンポーネントの明示的なインテントを作成します。アクティビティ内でこのコンストラクターを使用する場合は、 extendsthisであるため、最初のパラメーターとして使用できます。別のクラス(のような)からこのコンストラクターを使用する場合は、OnClickListenerではなくActivityのインスタンスを渡す最初のパラメーターとして指定する必要があります(拡張されないため)。ActivityContextOnClickListenerMyActivity.thisOnClickListenerContext


これを行うとき:

Intent in = new Intent().setClass(this, SecondActivity.class);

上記のように明示的なインテントを作成しています。これは、以下を使用する場合とまったく同じです。

Intent in = new Intent(this, SecondActivity.class);

OnClickListener最初のパラメータはa (またはのようContextに拡張するクラス)である必要があるため、内部でこれを行うことはできません。ContextActivity

明示的なインテントを作成する場合は、次を使用することもできます。

Intent in = new Intent().setClassName("com.something", "com.something.SecondActivity");

これにより明示的な意図が作成されますが、これは必要ありませんContext。パッケージ名とクラス名を文字列として渡すことができます(知っている場合)。

インテント解決の詳細については、以下を参照してください。

于 2012-08-27T10:26:42.730 に答える
0

「Intentin=new Intent(this、SomeActivity.class);」で「this」キーワードを使用する場合は、MainActivityのサブクラスに属していないことを確認してください。これにより、明示的なインテントの一部として間違ったアクティビティが設定される可能性があります。成分。強いテキスト

于 2020-12-23T00:06:47.910 に答える