2012-02-20 10 views
4

他のアクティビティを開始する方法はたくさんあります。 ほとんどのオーバーロードメソッドでは、コンテキストを渡す必要があります。Androidはコンポーネント名を使用してアクティビティを起動します

しかし、あなたは上記参照

public Intent setComponent (ComponentName component) 

およびコンポーネント名

ComponentName(String pkg, String cls) 

ため、このコンストラクタを使用して、アクティビティを起動するコンポーネント名を使用しているとき、私は任意のcontext引数

を使用せずにアクティビティを起動することができています

しかし、内部的に何らかの「コンテキスト」を使用する必要があります。もしそうなら、どのコンテキスト?アプリケーション1またはアクティビティ1? これは、私がこの2つの方法(上記)を使うたびに、私はコンテキストを一切通らないのでメモリリークについて心配する必要はないということですか?

おかげ

答えて

4

あなたはどちらの場合でメモリリークを心配する必要はありませんが、それはあなたがコンテキストオブジェクトを渡している場所に目を光らせていることを良いことです。インテントは、Intent(Context, Class)コンストラクタまたはsetClass(Context, Class)メソッドを使用するときに、単にコンテキストパラメータを使用してパッケージ名を検索します。彼らは単なる便利な方法です。

0

startActivity()は、パラメータとしてコンテキストを必要としません。これは、すでにコンテキストから派生した(または実装した)クラス内のメソッドです。つまり、それを呼び出すコンテキストがない場合は、startActivity()に電話をかけることはできません。

0

多分私はあなたの質問を理解できませんでした。しかし、あなたはインテントを定義するときにコンテキストを使用しません。インテントを使用してコンポーネントを呼び出すには、コンテキストを使用します。

context.startActivity(intent) 

をしかし、通常、あなたは、Contextを拡張している、あなたのアクティビティとサービス内のこれらのメソッドを呼び出します。たとえば、あなたが使用しています。したがって、あなたは、単に使用します。

startActivity(intent) 
5

adampの答えは正しいです(私が投稿する前に彼はそれに気づきました)。ただ、これは...

public Intent(Context packageContext, Class<?> cls) { 
    mComponent = new ComponentName(packageContext, cls); 
} 

Intent(Context packageContext, Class<?> cls)コンストラクタの源である...とadampが暗示するように、これはComponentName(Context pkg, Class<?> cls)コンストラクタ

public ComponentName(Context pkg, Class<?> cls) { 
    mPackage = pkg.getPackageName(); 
    mClass = cls.getName(); 
} 

ための源である、それを拡張する

Intentのメソッドがの場合は、Stringタイプ(mPackageおよび)のみを扱うComponentNameの作成にのみ使用する便利なメソッドです)。 IntentComponentNameも、Contextへの参照を保持していません。

+0

ありがとうMisterSquoink!私が許可されていれば、私はあなたの答えの両方を受け入れていたでしょう。しかし、とにかく、あなたのソースコードをありがとうございました..それは今明らかです。 – user1118019

+0

+1のソース –

関連する問題