Androidのアプリケーション・コンポーネント---4つのコンポーネント

6141 ワード

Androidの核心的な特性の一つは、アプリケーションが他のアプリケーションの要素として機能し、他のアプリケーションにデータを提供することができることです.たとえば、プログラムがいくつかのコントロールで画像をロードする必要がある場合、別のプログラムがこの機能を開発し、他のプログラムで使用できるようにすれば、自分でもう1つ開発するのではなく、プロセス間通信方式でそのプログラムを呼び出す機能を直接使用することができます.このような機能を実現するために、Androidシステムは、アプリケーションの任意の部分が必要なときにプロセスを開始し、その部分のJavaオブジェクトをインスタンス化する必要があります.したがって、多くの他のシステムのプログラムとは異なり、Androidプログラムは単一のアクセスポイントだけではなく、システムのインスタンス化と実行に必要なコンポーネントを持っており、Androidには4つのコンポーネントが提供されています.Androidの4つのコンポーネントはBroadcastReceiverのほか、Activity、Service、ContentProviderはAndroidManifest.xmlに登録しなければならないが、BroadcastReceiverはAndroidManifest.xmlファイルに登録したり、Javaコードやkotlinコードに登録したりすることができる.Android 8.0以降、Android Manifest.xmlファイルに静的に登録されたブロードキャスト受信が無効になったのは、公式の消費電力の最適化により、アプリがブロードキャストを乱用する処理を避けるためだ.
1、Activity Activityは展示型コンポーネントであり、Activityはユーザーに視覚的なユーザーインタフェースを提供する.例えば、1つのダイヤルアッププログラムには、電話をかけることができる連絡先を表示するためにActivityがあり、2つ目のActivityは連絡先を新規に書くために使用され、他のActivityは特定の連絡先を表示したり、連絡先情報を変更したりするために使用されます.アプリケーション内の各Activityが提供するユーザーインタフェースの集約性は強いが、しかし、各Activityは他のActivityとは独立しており、各インスタンス化されたActivityはActivityのサブクラスであり、IntentはActivityの起動をトリガすることができ、Intentは明示的なIntentトリガと暗黙的なIntentトリガに分けることができる.明示的なIntentトリガは、Activityコンポーネントを明確に指し、次のコードで表します.
   Intent in = new Intent(this,SecondActivity.class)
   MainActivity.this.startActivity(in)

暗黙的Intentトリガは、1つまたは2つ以上のActivityを指すターゲットコンポーネントであり、ターゲットActivityがなくてもよい.暗黙的トリガは次のコードで表される.
Intent intent = new Intent();
intent.setPackage("com.xe.launchmode");
intent.setAction("com.xe.actoin.MAP");
intent.addCategory("android.intent.category.APP_MAPS");
MainActivity.this.startActivity(intent);

2、サービスサービスはバックグラウンド処理タスク型コンポーネントであり、バックグラウンドで実行され、一連のコンピューティングタスクをバックグラウンドで処理したり、他のことを処理したりするときにバックグラウンド音楽を再生したりするために使用され、各サービスはサービスクラスから拡張されている.ServiceコンポーネントとActivityコンポーネントのオープンは異なり、Activityには次のコードで表される起動状態が1つしかありません.
Intent in = new Intent(this,SecondActivity.class)
startActivity(in)

サービスのオープンには2種類あり、起動状態にある場合、ユーザーインタフェースと対話する必要がなく、ライフサイクルがアプリケーションと同じように長く、マルチメディアプレーヤーが音楽を再生するのはアプリケーションサービスの非常に良い例です.マルチメディアプレーヤープログラムは、1つまたは複数のActivityを含み、ユーザはこれらのActivityによって音楽を選択して再生することができる.しかし、音楽再生にはActivityが必要ではありません.ユーザーは、プレーヤーを終了して他のアプリケーションを実行しても音楽を再生し続けることを望んでいる可能性があります.音楽を再生し続けるために、マルチメディアプレーヤーActivityがバックグラウンドで音楽を再生するサービスを起動する可能性があります.Androidシステムは、このサービスを起動したActivityが終了した後でも、音楽再生サービスを継続的に実行します.起動は次のコードで表されます.
Intent in = new Intent(this,SecondActivity.class)
MainActivity.this.startService(in)

バインドされた状態にある場合、バックグラウンド・タスクを実行したり、ユーザー・インタフェースとインタラクティブにしたりできます.ライフサイクルはユーザー・インタフェースと同じ長さです.バインドは次のコードで表されます.
ServiceConnection mBinderPoolConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
    
Intent intent = new Intent(mContext, MyService.class);   
MainActivity.this.bindService(intent,new ServiceConnection(),Context.BIND_AUTO_CREATE);

以上の2でオンにすると、いずれもプライマリ・スレッドで実行されるため、サービスで直接時間のかかる操作はできません.時間のかかる操作をしなければならない場合は、ワーク・スレッドを開いて実行する必要があります.
3、BroadcastReceiverは一般的にタスクを実行せず、ブロードキャスト通知のクラスのコンポーネントを受信し、対応するだけである.ほとんどのブロードキャスト通知は、タイムゾーンの変更、目覚まし時計のアラート、ユーザが画像を選択した、またはユーザが言語プリファレンスを変更したなど、システムによって生成される.アプリケーションは、他のアプリケーションに一部のデータがデバイスにダウンロードされて使用可能であることを通知するなど、ブロードキャスト通知を送信することもできる.1つのアプリケーションのBroadcastReceiverが通知に応答し、すべてのBroadcastReceiverの実装クラスがBroadcastReceiverクラスから拡張されます.BroadcastReceiverは、システム内で動作するため、ユーザーインタフェースがないため、異なるコンポーネントと異なるプロセス間で通信するのに適しています.以下では、AndroidManifest.xmlファイルで作成された2つの登録方法について説明します.アプリケーションをインストールするとアプリケーション解析が適用され、アプリケーションを起動せずにブロードキャストを受信することができ、wifi状態の変化を次のように傍受するコードで表示されます.

    
          
          
          
     

以上のコードから,受信プロセスの整合は記述することによって,ブロードキャストが低結合の観察者モードであるという結論をまとめることができることが分かった.もう1つの方法は、ブロードキャストを受信するにはアプリケーションを起動する必要があります.Javaコードで登録を完了することで、次のコードで動的登録を表します.
public class MyBroadcastReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent){
            
        }
 }
 
 
 MyBroadcastReceiver receiver = new MyBroadcastReceiver();
 IntentFilter filter=new IntentFilter();
 filter.addAction("com.xe.intent.action.ACTION_1");
 filter.addAction("com.xe.intent.action.ACTION_2");
 SecondActivity.this.registerReceiver(receiver,filter);

ブロードキャストを送信するには、次のコードを使用します.
Intent intent = new Intent();
intent.setAction("com.xe.intent.action.ACTION_2");
MainActivity.this.sendBroadcast(intent);

以上の2つのブロードキャストの登録方式では、ブロードキャストを受信する方法がメインスレッドで呼び出されるため、ブロードキャストの受信に時間がかかる操作はできない.
4、ContentProvider ContentProviderは共有データ型コンポーネントであり、アプリケーションはContentProviderを通じて他のアプリケーションのデータにアクセスすることができ、他のアプリケーションのプライベートデータを含む.サービスと同様に、ユーザーインタフェースはありません.内部にはinsert、update、delete、queryメソッドが必要です.内部でデータセットを使用してマージされ、データセットには要求されません.ContentProviderはプロセス間通信であり、Androidシステムがコンポーネントの処理を必要とするリクエストを受信すると、Androidはこのリクエストを処理するコンポーネントのホストプロセスが実行されているかどうかを確認し、そうでない場合はすぐにこのプロセスを開始します.ContentProviderは、外部インタフェースContentResolverが他のプロセスにデータにアクセスするために提供します.次のコードの一部は、queryメソッドの使用手順を簡単に表します.
Uri bookUri = Uri.parse("content://com.zyb.provider/data");
ContentResolver cr = ContentProviderActivity.this.getContentResolver();
Cursor bookCursor = cr.query(bookUri,new String[]{"_id","name"},null,null,null);
while (bookCursor.moveToNext()) {
   int id = bookCursor.getInt(0);
   String name = bookCursor.getString(1);
}

上記のコードでは、まずデータにアクセスするUriを作成し、次にアプリケーションを介してContentResolverインタフェースを取得し、このインタフェースを介してデータセットCursorオブジェクトを取得し、最後にCursorオブジェクトを介してインデックスを検索して最終的に必要なデータを取得します.よし、本章の内容はここまで書いて、本人の技術が限られているため、文章に間違いが生じるのは避けられない.後でAndroidの4つのコンポーネントの仕事の過程のソースコードの分析を書く時間を探して、みんなの読書に感謝します.