Android Basic Learning Day11 |一般的なコンポーネント-ブロードキャストとサービス

前面に書かれた言葉

1.主な参考資料:https://b23.tv/Flmxaa
2.コンテンツに問題がある場合は、指摘または追加したいと思います。
3.新しい知識。

1.放送

(1)放送受信機

①概要

ブロードキャストレシーバー(BroadcastReceiver): Androidシステムには多くのブロードキャストが組み込まれています。たとえば、電話の電源がオンでバッテリーが少なくなると、ブロードキャストが送信されます。システムまたはアプリケーションからのブロードキャストイベントを監視するために、Androidシステムはブロードキャストレシーバーコンポーネント(4つの主要コンポーネントの1つ)を提供します。当Android系统产生一个广播事件时,可以有多个对应的广播接收者接收并进行处理これは、無線メッセージを受信する無線に相当します。

特徴:1対多(たとえば、ラジオ局によって送信された周波数は複数のラジオで受信できます)、およびメッセージは一方向です(たとえば、ラジオはメッセージのみを受信できます)。

②テスト

1放送受信機を作成します。
ここに写真の説明を挿入
ここに写真の説明を挿入
2放送受信機を動的に登録-作成

静的登録:通常、システムはプロジェクトマニフェストファイルに自動的に登録します。

動的登録の特徴:放送受信機を登録するコンポーネントが生きている(存在する)場合にのみ、対応する放送受信機が放送を受信します。これは静的登録との違いでもあります。
ここに写真の説明を挿入
3テスト-インターセプトコール

①レイアウト
ここに写真の説明を挿入
②コード部
ここに写真の説明を挿入
ここに写真の説明を挿入
③操作効果

プロジェクトリストファイルは
ここに写真の説明を挿入
次のとおりです。
ここに写真の説明を挿入

(2)カスタムブロードキャストの送受信

①概要

システムが提供するブロードキャストがニーズを満たせない場合は、ブロードキャストをカスタマイズして(メッセージを送信)、対応するブロードキャストレシーバーを作成する(メッセージを監視する)必要があります。

当自定义广播发送消息时,会存储到公共消息区中,而公共消息区中如果存在对应的广播接收者,就会及时的接收这条消息

②テスト

1レイアウトとMainActivity.javaコンテンツ
ここに写真の説明を挿入
ここに写真の説明を挿入
2テスト効果

上記のテストと同じ理由で、プロジェクトマニフェストファイル(カスタムブロードキャストイベントの意図を宣言)の
ここに写真の説明を挿入
実行結果を処理します。
ここに写真の説明を挿入

(3)秩序ある放送と無秩序な放送

①概要

Androidシステムは、順序付き放送と順序なし放送の2種類の放送を提供します。開発者は、必要に応じて番組に異なる放送タイプを設定できます。

整然とした放送:受信者の優先順位に従って受信し、1つの放送受信者だけがメッセージを受信できます此广播接收者中逻辑执行完毕后,才会继续传递

アウトオブオーダーブロードキャスト:完了しました异步执行。ブロードキャストを聞くすべてのブロードキャスト受信者は、ブロードキャストの送信時にこのメッセージを受信しますが、受信の順序は不明です。

有序广播可以被拦截;无序广播所有的广播接收者都可以接收到消息

②テスト-整然とした放送

より良いテストのために3つの新しい放送受信機を作成する必要があります。これらの3つの放送受信機の設定は次のように似ています
ここに写真の説明を挿入
。1わずかにレイアウト

2ランニング効果

プロジェクトリストファイルの
ここに写真の説明を挿入
効果は次のとおりです。
ここに写真の説明を挿入
注:priorityの値が同じ(同じpriority)の場合、最初にメッセージを受信するようにプロジェクトリストファイル(前の位置)で最初に宣言されます。優先度の高いブロードキャストが中断されると(ブロードキャストレシーバーに書き込まれる拦截有序广播:abortBroadcast();)、優先度の低いものはメッセージを受信しなくなりますが、ブロードキャストレシーバーのメッセージを強制的に受信する方法があります(以下に示すように、sendメソッドで記述されます)。
ここに写真の説明を挿入

2.サービス

Day12コンテンツ。
サービス(サービス)も4つの主要コンポーネントの1つであり、インターフェイスのないアクティビティと見なすことができます(通常、電話スクリーンがオフになった後の音楽の再生などのバックグラウンド操作に使用されます)。
最大の特徴:バックグラウンドで長時間実行できます。

(1)基礎知識

作成:ブロードキャストレシーバーの作成と同様です(パッケージ名を右クリックして、[新規]→[サービス]→[サービス]→ポップアップウィンドウにサービス名またはデフォルトを入力します)。作成されたJavaクラスServiceクラスを継承してサービスを作成するには、プロジェクトマニフェストファイルに手動で登録する必要があります。

ライフサイクル:つまり、起動からシャットダウンまでのプロセス。開始方法をオンにし
ここに写真の説明を挿入
ます。

①startService()メソッドを介して:サービスは長時間バックグラウンドで実行され、サービスのステータスはオープナーのステータスとは関係ありません。つまり、サービスを開始したコンポーネントが破棄されても、サービスは引き続き実行されます。需要自身调用stopSelf()方法或其他组件调用stopService()方法时服务才能停止

②bindService()メソッドを介して:サービスはコンポーネントにバインドされます。需要调用onUnbind()方法解除绑定之后才会被销毁注:長期間存在する場合は、バインドする前にstartService(併用)でサービスを開始する必要があります。

(2)テスト

①startServiceがサービスを開始します

1レイアウト
ここに写真の説明を挿入
2サービスクラス
ここに写真の説明を挿入
3表示結果の
ここに写真の説明を挿入
概要:onCreate()は、サービスの作成時に実行され(作成が成功すると効果がなくなります)、1回だけ呼び出され、複数回実行してサービスを開始することを意味します。 (サービスがまだ開始されている限り))onStartCommand()を複数回呼び出し、以前に生成されたサービスオブジェクトのみを再利用し、新しいサービスオブジェクトを作成しません。onDestroy()は、onCreate(()と同じようにサービスを閉じることを意味します。 )、一度だけ呼び出されます。

②bindServiceがサービスを開始します

1レイアウトを省略します(①のレイアウト設定と同じ)

2コード

①MyService.java

OnBind()メソッドでは、IBinderインスタンスを返す必要があります。そうしないと、接続ステータスを監視するためのメソッドが呼び出されません。

package com.example.testservice;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    
    
    public MyService() {
    
     }

    //定义onBinder方法所返回的对象实例
    //创建服务代理 调用服务中的方法
    class MyBinder extends Binder{
    
    
        //可以间接调用到service里面的相关方法
        public void callTestInService(){
    
    
            testInService();
        }
    }
    public void testInService(){
    
    
        Log.i("MyService","自定义方法,testInService()");
    }

    @Override
    //IBinder是一个接口  可进行跨进程访问(远程调用)
    public IBinder onBind(Intent intent) {
    
    
        Log.i("MyService","绑定服务,调用onBind()");
        return new MyBinder();
    }

    @Override
    public void onCreate() {
    
    
        super.onCreate();
        Log.i("MyService","创建服务,调用onCreate()");
    }

    @Override
    //解绑
    public boolean onUnbind(Intent intent) {
    
    
        Log.i("MyService","解绑服务,调用onUnbind()");
        return super.onUnbind(intent);
    }
}

②MainActivity.java

package com.example.testservice;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    
    
    private MyService.MyBinder myBinder;
    private MyTest mytest;

    @Override
    //自带
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //绑定(开启)服务
    public void btnBind(View view){
    
    
        if(mytest == null){
    
    
            mytest = new MyTest();
        }
        Intent intent = new Intent(this,MyService.class);
        //参数1:用于指定要启动的service,参数2:监听调用者与service间的连接状态,
        // 参数3:指定绑定时是否自动创建service
        bindService(intent,mytest,BIND_AUTO_CREATE);
    }

    //服务连接时执行
    private class MyTest implements ServiceConnection{
    
    
        @Override
        //当成功绑定服务时调用,返回MyService里面的Ibinder对象
        public void onServiceConnected(ComponentName name, IBinder service) {
    
    
            myBinder = (MyService.MyBinder) service;
            Log.i("MainActivity","服务成功绑定,内存地址为:"+myBinder.toString());
        }
        //当服务失去连接时,调用的方法
        @Override
        public void onServiceDisconnected(ComponentName name) {
    
    
            Log.i("MainActivity","服务失去连接");
        }
    }

    //调用服务中的方法
    public void btnCall(View view){
    
    
        //访问到MyService里的callTestInService()方法
        myBinder.callTestInService();
    }

    //解绑服务
    public void btnUnbind(View view){
    
    
        //需要判断是因为:解除绑定时就需要接收ServiceConnection
        if(mytest != null){
    
    
            unbindService(mytest);
            mytest = null;
        }
    }
}

3表示結果の
ここに写真の説明を挿入
まとめ:サービスが複数回開始された場合、onBind()は1回だけ呼び出されます。

3、補足

1. Androidの4つの主要コンポーネントが定義されている限り、それらはAndroidManifest.xml(マニフェストファイル)に登録する必要があります。通常、システムは自動的に登録します。

2.発生したインテントエラーの問題

おすすめ

転載: blog.csdn.net/luck_ch09/article/details/112847532