サービスは、UI を提供せずにバックグラウンドで長時間実行される操作を実行するアプリケーション コンポーネントです。サービスは他のアプリケーション コンポーネントによって開始でき、ユーザーが別のアプリケーションに切り替えた場合でもバックグラウンドで実行され続けます。
さらに、コンポーネントはサービスにバインドすることでサービスと対話し、プロセス間通信 (IPC) を実行することもできます。たとえば、サービスはバックグラウンドでネットワーク トランザクションを処理したり、音楽を再生したり、ファイル I/O を実行したり、コンテンツ プロバイダーと対話したりできます。
受付
デスクサービスは、ユーザーが気づくことができるいくつかの操作を実行します。たとえば、オーディオ アプリはフォアグラウンド サービスを使用してオーディオ トラックを再生します。フォアグラウンド サービスは通知を表示する必要があります。ユーザーがアプリとの対話を停止しても、フォアグラウンド サービスは実行され続けます。
フォアグラウンドサービスを開始する
フォアグラウンド サービスは、ユーザーにインターフェイス上の操作を提供できます。すべてのフォアグラウンド サービスは、通知バーに通知を表示する必要があります。ユーザーは、アプリのフォアグラウンド サービスが実行されていることを認識できます。この通知はデフォルトでは削除できません。サービスが停止されると、通知はシステムによって削除されます。ユーザーがアプリを直接操作する必要がなく、アプリがユーザーにステータス表示を表示する必要がある場合は、フォアグラウンド サービスを使用できます。
アクティビティ内でサービスを開始し、startForegroundService(Intent)
メソッドを呼び出します。
startForegroundService(Intent(applicationContext, ForegroundService1::class.java))
次に、サービス内で、それに応じてメソッドを使用する必要がありますstartForeground
。
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d(TAG, "onStartCommand flags:$flags, startId:$startId [$this] ${Thread.currentThread()}")
val pendingIntent: PendingIntent =
Intent(this, ForegroundDemoAct::class.java).let {
notificationIntent ->
PendingIntent.getActivity(this, 0, notificationIntent, 0)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val chanId = "f-channel"
val chan = NotificationChannel(chanId, "前台服务channel",
NotificationManager.IMPORTANCE_NONE)
chan.lightColor = Color.BLUE
chan.lockscreenVisibility = Notification.VISIBILITY_PRIVATE
val service = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
service.createNotificationChannel(chan)
Log.d(TAG, "服务调用startForeground")
val notification: Notification =
Notification.Builder(applicationContext, chanId)
.setContentTitle("RustFisher前台服务")
.setContentText("https://an.rustfisher.com")
.setSmallIcon(R.drawable.f_zan_1)
.setContentIntent(pendingIntent)
.build()
startForeground(1, notification)
} else {
Log.d(TAG, "${Build.VERSION.SDK_INT} < O(API 26) ")
}
return super.onStartCommand(intent, flags, startId)
}`
サービス中のこのコードを見てみましょう。シンプルなものを作成しましたNotification
。
- PendingIntent は、通知をクリックした後のジャンプ アクションとして通知に割り当てられます。
- 最初にNotificationManagerを使用してNotificationChannelを作成します
- タイトル、コンテンツ テキスト、アイコンなどの構成など、通知を構成および作成するには、Notification.Builder を使用します。
- フォアグラウンド サービスを開始し、
startForeground(1, notification)
メソッドを呼び出します
デバイス上に通知が表示されますので、この通知をクリックするとForegroundDemoActにジャンプします。これは以前は PendingIntent で設定されていました。
故障中
stopService
サービスを停止するために使用できます
stopService(Intent(applicationContext, ForegroundService1::class.java))
このようにして、サービスは終了し、onDestroy
メソッドを取得します。
フォアグラウンドサービスを停止する
サービス内のstopForeground(boolean)
メソッドを呼び出すとフォアグラウンドを停止できますが、サービス全体は終了しません。このブール値は、フォアグラウンド サービスの通知をキャンセルするかどうかを示します。false は通知を保持することを意味します。
たとえば、サービスに電話をかけると、
stopForeground(false)
サービスはバックグラウンド サービスになり、終了しませんでした。このとき、スライドすることで該当の通知をキャンセルすることができます。
エラーメッセージ
ANR
スタートアップ サービスはアクティビティ内で呼び出されますstartForegroundService(Intent)
が、呼び出されませんService.startForeground()
。OnePlus 5携帯電話Android10の実行ログは次のとおりです
2021-08-26 23:03:25.352 25551-25551/com.rustfisher.tutorial2020 D/rustAppUseStartService: 调用 startForegroundService 主线程信息Thread[main,5,main]
2021-08-26 23:03:25.368 25551-25551/com.rustfisher.tutorial2020 D/rustAppForeground1: onCreate Thread[main,5,main] rustfisher.com
2021-08-26 23:03:25.370 25551-25551/com.rustfisher.tutorial2020 D/rustAppForeground1: onStartCommand flags:0, startId:1 [com.rustfisher.tutorial2020.service.foreground.ForegroundService1@c77d408] Thread[main,5,main]
2021-08-26 23:03:35.375 1596-1720/? W/ActivityManager: Bringing down service while still waiting for start foreground: ServiceRecord{
53d70f2 u0 com.rustfisher.tutorial2020/.service.foreground.ForegroundService1}
2021-08-26 23:03:35.382 25551-25551/com.rustfisher.tutorial2020 D/rustAppForeground1: onDestroy [com.rustfisher.tutorial2020.service.foreground.ForegroundService1@c77d408] Thread[main,5,main]
2021-08-26 23:03:52.956 1596-1720/? E/ActivityManager: ANR in com.rustfisher.tutorial2020
PID: 25551
Reason: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{
53d70f2 u0 com.rustfisher.tutorial2020/.service.foreground.ForegroundService1}`
不正な通知
ForegroundService1のメソッドにonStartCommand
追加しますstartForeground
。startForeground(0, noti)
ID 0 が渡されると、エラーが報告されますRemoteServiceException
。
29871-29871/com.rustfisher.tutorial2020 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.rustfisher.tutorial2020, PID: 29871
android.app.RemoteServiceException: Bad notification for startForeground
バックグラウンドサービス
バックグラウンド サービスは、ユーザーが直接気付かない操作を実行します。たとえば、アプリがストレージを圧縮するためにサービスを使用する場合、そのサービスは通常、バックグラウンド サービスです。
- この記事のサービス/サービスはバックグラウンド サービスを指します。
- 例は Kotlin を使用して実装されています。
新しいサービス
Serviceを継承する新しいServiceStartDemoクラスを作成します。
class ServiceStartDemo : Service() {
companion object {
const val TAG = "rustAppStartDemoService"
}
override fun onCreate() {
super.onCreate()
Log.d(TAG, "onCreate ${Thread.currentThread()}")
}
override fun onBind(intent: Intent): IBinder? {
Log.d(TAG, "onBind ${Thread.currentThread()}")
return null
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d(TAG, "onStartCommand flags:$flags, startId:$startId [$this] ${Thread.currentThread()}")
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy [$this] ${Thread.currentThread()}")
}
}
- 各ライフサイクルメソッドで、追跡観察のためにログにマークを付けます。
- サービスオブジェクトの詳細情報やスレッド情報などをログに出力します
- onBind メソッドでは、bindService によってサービスを開始できないことを示す null を返します。
このサービスを AndroidManifest.xml に登録します
<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- ... -->
<application>
<service
android:name=".service.start.ServiceStartDemo"
android:enabled="true"
android:exported="false" />
<!-- ... -->
</application>
</manifest>
知らせ
- name はサービスのクラス名です。それが唯一の必須属性です
- Enabled は true で、システムがこのサービスをインスタンス化できることを示します。デフォルト値は true です
- アプリケーションには独自の有効プロパティもあり、デフォルト値は true です。このプロパティは、サービスを含むすべてのアプリケーション コンポーネントに適用されます。
- ここでは Exported が false に設定されており、他のプロセス (アプリ) によって使用されず、サービスの準備が整うためにアプリにのみ適用されることを示します。
startService サービスの開始
アクティビティで startService メソッドを呼び出してサービスを開始します。
startService(Intent(applicationContext, ServiceStartDemo::class.java))
メソッドを呼び出した後、ServiceStartDemo サービスが開始されます。初めて開始されるとき、サービスは onCreate メソッドと onStartCommand メソッドを通過します。初期化性質のコードはonCreateに配置されます。
サービスがすでに存在する場合は、startService メソッドを使用してサービスを開始します。サービスは onStartCommand メソッドを使用します。このとき、onStartCommand の startId は自動的に増加します。この値を使用して、Service オブジェクトが開始された回数を確認します。
同時に、サービス ライフ サイクル関数がメイン スレッドで実行されていることをサービス ログで確認できます。したがって、サービスでも ANR の問題が発生する可能性があります。時間のかかるタスクをライフサイクル関数に入れないでください。
アクティビティはサービスと通信します
アクティビティとサービスは独立したコンポーネントです。このメソッドを使用してstartService
サービスを開始しても、アクティビティはサービスのインスタンスを保持しません。ブロードキャストを使用して相互に通信できます。または、EventBus などのツールを使用して通信します。
故障中
タスクが完了したら、サービスを停止できます。システムリソースを節約します。前者はstartService
メソッドによって開始されたサービスであり、後者はサービスを停止するstopService(Intent)
ために使用されます。
方法 | 導入 |
---|---|
stopService(意図) | アクティビティまたは他のコンポーネントは、このメソッドを呼び出してターゲット サービスを停止します。 |
stopSelf() | サービスはこのメソッドを呼び出して自身を停止します |
たとえばアクティビティでは
stopService(Intent(applicationContext, ServiceStartDemo::class.java))
稼働中
stopSelf()
stopSelf()
または を使用してstopService()
サービスを停止する要求が行われると、サービスはonDestroy()
反対方向に進みます。システムはできるだけ早くサービスを破棄します。
製本サービス
アプリケーション コンポーネントが呼び出しを通じてサービスにバインドされるbindService()
と、サービスがバインドされます。
バインドされたサービスは、コンポーネントがサービスと対話し、リクエストを送信し、結果を受信し、プロセス間通信 (IPC) を使用してプロセス間でこれらの操作を実行するためのクライアント/サーバーインターフェイスを提供します。バインドされたサービスは、別のアプリケーション コンポーネントにバインドされた場合にのみ実行されます。複数のコンポーネントを同時にサービスにバインドできますが、すべてのコンポーネントがバインド解除されると、サービスは破棄されます。
サービス関連の面接の質問
1. サービスとは何ですか?
サービスは Android の 4 つの主要コンポーネントの 1 つであり、ユーザー インターフェイスのアプリケーション コンポーネントなしでバックグラウンドで長時間実行される操作を実行できます。
Serviceを開始するには、startService startとbindService startの2つの方法があります。
注: サービスは、他のアプリケーション オブジェクトと同様、ホスティング プロセスのメイン スレッドで実行されます。これは、サービスが CPU を大量に使用する操作 (MP3 再生など) またはブロック操作 (ネットワークなど) を実行する必要がある場合、サービス内に別の子スレッドを作成する必要があり、その後、時間のかかる操作を問題なく処理できることを意味します。ここで。
2. サービス登録時の注意事項
サービスは引き続きメイン スレッドで実行されるため、複雑な論理操作を実行する必要がある場合は、サービス内に処理用のサブスレッドを手動で作成することが最善です。そうしないと、UI スレッドがブロックされます。
3. サービスとアクティビティ間の通信方法
方法 1:
- Binderを継承する内部クラスを追加し、対応するロジックメソッドを追加する
- Service の onBind メソッドを書き換えて、先ほど定義した内部クラスのインスタンスを返します。
- onServiceConnected が論理メソッドを呼び出してサービスをバインドするときに、ServiceConnection を書き換えます。
方法 2
- インターフェイス Iservice を介して Service メソッドを呼び出すこと、インターフェイスを使用してサービスを呼び出すこと、およびサービスを直接呼び出すことは、実際には本質的には同じですが、追加の言い訳手順があります。
4. IntentServiceとServiceの違い(IntentServiceのメリット)
IntentService は Service のサブクラスであり、自動的に停止する非同期サービスであり、従来の Service で時間のかかる操作を処理した後に Service を停止して破棄するのを忘れるという問題を解決します。
- すべてのインテント リクエストを処理するために別のワーカー スレッドが作成されます。
- 独立したワーカー スレッドが作成され、マルチスレッドの問題に対処することなく、onHandleIntent() メソッドによって実装されたコードを処理します。
- すべてのリクエストが処理された後、サービスを停止する stopSelf() メソッドを呼び出さなくても、IntentService は自動的に停止します。
- Service の onBind() のデフォルト実装を提供し、null を返します。
- サービスの onStartCommand のデフォルト実装を提供して、リクエスト インテントをキューに追加します。
- IntentService は UI スレッドをブロックしませんが、通常の Service は ANR 例外を引き起こします
- Intentservice が前のタスクを完了していない場合、新しいスレッドは開かず、前のタスクが完了するまで待ってから新しいタスクを実行し、タスクが完了した後に stopSelf() を再度呼び出します。
5. サービスはメインスレッドで実行されますか? 時間のかかる操作をサービス内で実行できますか?
デフォルトでは、表示されていない場合は、サービスの実行プロセスを指します。サービスとアクティビティは、現在のアプリが配置されているプロセスのメインスレッド (UI メインスレッド) で実行されます。
時間のかかる操作 (ネットワーク リクエスト、データベース、大きなファイルのコピー)はサービス内では実行できません
特殊な場合には、マニフェスト ファイルでサービスが実行されるプロセスを構成して、サービスを別のプロセスで実行できるようにすることができます。
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" >
</service>
6. サービスのライフサイクル
サービスにはバインド モードと非バインド モードがあり、これら 2 つのモードが混在して使用されます。使用方法が異なれば、ライフサイクル方法も異なります。
- 非バインド モード: startService が初めて呼び出されるとき、実行されるメソッドは onCreate()、onStartCommand() の順で、サービスが閉じられるときに onDestory メソッドが呼び出されます。
- バインド モード: 最初の bindingService() が実行されると、バインドが解除されると onCreate() と onBind() が実行され、onUnbind() と onDestory() が実行されます。
上記 2 つのライフ サイクルは比較的単純なモードです。開発プロセス中は、Service インスタンスが 1 つだけ存在することにも注意する必要があります。つまり、開始する Service がすでに存在する場合、Service は再度作成されず、もちろん onCreate() メソッドも作成されません。と呼ばれた。
サービスは複数のクライアントによってバインドできますが、バインドされたすべてのオブジェクトのみが実行されます。
onBind() メソッドの実行後に Service は破棄されますが、クライアントが onStart() メソッドを実行した場合、この時点ですべてのバインド クライアントが unBind() を実行すると、Service は破棄されません。
覚えやすいように、サービスのライフサイクル図を以下に示します。
startService はサービスのライフサイクルを開始する場合にのみ使用してください。
BindService はサービスのライフサイクルをバインドする場合にのみ使用してください。
同時に、startService() を使用してサービスを開始し、BindService() を使用してサービスのライフサイクルをバインドします。
7. アクティビティ、インテント、サービスの関係は何ですか
これらは Android 開発で最も頻繁に使用されるクラスです。その中でも、Activity と Service は Android の 4 つの主要コンポーネントの 1 つです。どちらも Context クラスのサブクラスである ContextWrapper のサブクラスであるため、兄弟とみなすことができます。ただし、2 人の兄弟はそれぞれ独自のスキルを持っており、アクティビティはユーザー インターフェイスの表示と操作を担当し、サービスはバックグラウンド タスクの処理を担当します。Intent を介して Activity と Service の間でデータの受け渡しができるため、Intent は通信メッセンジャーとみなすことができます。
8. サービスとアクティビティは同じスレッド内にありますか?
同じアプリの場合、デフォルトでは同じスレッド、つまりメイン スレッド (UI スレッド) 内にあります。
9. サービスの優先順位を上げるにはどうすればよいですか?
AndroidManifest.xml
ファイルではandroid:priority = “1000”
、この属性を使用してインテント フィルターの最高の優先順位を設定できます。1000 が最高値で、数値が小さいほど優先順位が低くなり、ブロードキャストに実用的です。- onStartCommand のメソッドを呼び出して
startForeground()
サービスをフォアグラウンド プロセス レベルにアップグレードしてから、stopForeground ()
onDestroy のメソッドを忘れずに呼び出してください。 - onStartCommand メソッドは手動で START_STICKY を返します。
- onDestroy メソッドでブロードキャストを送信してサービスを再起動します。サービス +ブロードキャスト メソッドは、サービスがオンデストーリーになるときにカスタム ブロードキャストを送信し、ブロードキャストを受信するとサービスを再開します。(サードパーティアプリや設定アプリ強制停止時はAPPのプロセスが直接強制終了され、onDestroyメソッドが入らないため実行される保証はありません)
- システムブロードキャストを監視してサービスの状態を判断します。携帯電話の再起動、インターフェイスのウェイクアップ、アプリケーションのステータス変更などのシステムのブロードキャストを通じて、監視およびキャプチャし、サービスがまだ生きているかどうかを判断します。
- アプリケーションと Persistent 属性。
10. Service の onStartCommand メソッドには戻り値がいくつありますか? それらは何を意味しますか?
戻り値は 4 つあります。
- **START_STICKY: **サービスプロセスが強制終了された場合、サービスのステータスは開始ステータスとして保持されますが、配信されたインテントオブジェクトは保持されません。次に、システムはサービスの再作成を試みますが、サービスの状態が開始状態であるため、サービスの作成後に onStartCommand(Intent, int, int) メソッドが呼び出されます。この間に開始コマンドがサービスに渡されなかった場合、パラメータ Intent は null になります。
- START_NOT_STICKY:「非粘着性」。この戻り値を使用する場合、onStartCommand の実行後にサービスが異常終了した場合、システムはサービスを自動的に再起動しません。
- **START_REDELIVER_INTENT:** インテントを再送信します。この戻り値を使用する場合、onStartCommand の実行後にサービスが異常終了した場合、システムは自動的にサービスを再起動し、Intent の値を渡します。
- START_STICKY_COMPATIBILITY: START_STICKY の互換バージョンですが、サービスが強制終了された後に再起動されることは保証されません。
11. アクティビティがサービスのメソッドを呼び出す方法は何ですか?
- バインダー: Binder インターフェイスの形式で実装されます。アクティビティがサービスを正常にバインドすると、アクティビティは ServiceConnection クラスの onServiceConnected() コールバック メソッドでサービスの onBind() メソッドによって返された Binder サブクラスを取得し、呼び出します。オブジェクトメソッドを通じてそれを行います。
- Aidl: Aidl は、クライアントとサーバーが同じアプリケーション内にないシナリオにより適しています。
- Messenger:他のユーザーが (mMessenger.send(Message msg) メソッドを使用して) メッセージを送信できるように、Handler オブジェクトを参照します。このクラスでは、プロセス間のメッセージベースの通信 (つまり、2 つのプロセスがメッセージを介して通信できます) が可能で、サーバー側のハンドラーを使用してメッセンジャーが作成され、クライアントはこのメッセンジャーを保持した後にサーバーと通信できます。1 つのメッセンジャーは同時に両方向に送信できませんが、2 つのメッセンジャーは両方向に送信できます
12. サービスとスレッドの違い
サービスは Android のシステム コンポーネントであり、独立したプロセスのメイン スレッドで実行され、時間のかかる操作を実行することはできません。スレッドはプログラム実行の最小単位であり、CPU 割り当ての基本単位であり、時間のかかる操作を実行するためにサブスレッドを開始できます。Serviceは別のActivity内で独自のインスタンスを取得することができ、Serviceの運用に便利です。Thread は異なるアクティビティで自身のインスタンスを取得することが困難であり、Activity が破壊されると再度 Thread インスタンスを取得することが困難になります。
13. IntentService の使用
IntentService は Scrvice のサブクラスであるため、通常の Service ではなく、通常の Service に機能を追加します。
まず、Service 自体の 2 つの問題を見てみましょう。
- サービスは特に別のプロセスを開始するわけではなく、サービスとそのアプリケーションは同じプロセス内にあります。
- Service は新しいスレッドではないため、時間のかかるタスクを Service で直接処理しないでください。
IntentService は Service の不足を補うだけです。
IntentService の特徴:
- IntentService は、すべての Intent リクエストを処理するための別のワーカー スレッドを作成します。
- IntentService は、onHandleIntent() メソッドによって実装されたコードを処理するための別のワーカー スレッドを作成するため、開発者はマルチスレッドの問題に対処する必要がありません。
IntentService インスタンス
- IntentService クラスから継承した SccIntentService.java を作成し、onHandleIntent() メソッドを書き換えて、引数なしのコンストラクターを作成します。コードは次のとおりです。
public class SccIntentService extends IntentService {
public SccIntentService() {
super("SccIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
MLog.e(getClass().getName(), "onHandleWork");
for (int i = 0; i < 3; i++) {
try {
MLog.e(getClass().getName(), "Number:开始"+i);
Thread.sleep(10000);
MLog.e(getClass().getName(), "Number:结束"+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
MLog.e(getClass().getName(), "onDestroy");
}
}
\2. IntentService コンポーネント宣言を追加し、AndroidManifest.xml ファイルで Service コンポーネントを宣言します。コードは次のとおりです。
<service android:name=".service.SccIntentService"/>
\3. SccIntentService を開始する
startService(new Intent(ServiceActivity.this, SccIntentService.class));</pre>
\4. 実行結果
07-07 18:00:39.505 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonCreate
07-07 18:00:39.531 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonStart
07-07 18:00:39.531 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonResume
07-07 18:01:12.690 E/-SCC-com.scc.demo.service.SccIntentService: onHandleWork
07-07 18:01:12.690 E/-SCC-com.scc.demo.service.SccIntentService: Number:开始0
07-07 18:01:22.691 E/-SCC-com.scc.demo.service.SccIntentService: Number:结束0
07-07 18:01:22.697 E/-SCC-com.scc.demo.service.SccIntentService: Number:开始1
07-07 18:01:32.698 E/-SCC-com.scc.demo.service.SccIntentService: Number:结束1
07-07 18:01:32.698 E/-SCC-com.scc.demo.service.SccIntentService: Number:开始2
07-07 18:01:42.699 E/-SCC-com.scc.demo.service.SccIntentService: Number:结束2
07-07 18:01:42.716 E/-SCC-com.scc.demo.service.SccIntentService: onDestroy
通常のサービスは 20 秒の時間のかかる操作を直接実行するため、メインスレッドがブロックされ、ANR (プログラム応答なし) 例外が発生します。
IntentService は、メイン スレッドをブロックすることなく、ましてや ANR を生成することなく、30 秒の時間のかかる操作を実行します。上図に示すように、18:01:12>18:01:42 から 30 秒間開始され、通常の動作中に ANR は生成されません。
IntentService のもう 1 つの利点は、「使用後に消える」ことです。onHandleIntent() メソッドで時間のかかる操作を実行した後、onDestroy() メソッドを呼び出してメソッドを閉じます。
QR コードをスキャンすると、Android のゼロベースの入門から習熟まで、より完全な情報を無料で入手できます。!!
[Tencent 技術チーム制作] Android ゼロベース入門、Android Studio インストール チュートリアル + Android 基本チュートリアルのフルセット
Android プログラミング チュートリアル
入門から慣れるまでの Java 言語の基礎
Kotlin 言語の基礎から入門まで
初心者から使い慣れたものまでの Android テクノロジースタック
Android Jetpack ファミリー バケットの包括的な学習
初心者にとって Android Studio のインストールは難しいかもしれません。次のビデオを見て、インストールと実行を段階的に学習してください。
Android Studioのインストールチュートリアル
Java 段階の学習では、この段階ではビデオ学習に重点を置き、抜け漏れがないか確認するために書籍で補うことをお勧めします。書籍に焦点を当てている場合は、書籍の説明に基づいてコードを入力し、指導ビデオで補足して抜け漏れがないか確認することができます。問題が発生した場合は、Baidu にアクセスしてください。通常、多くの人は使い始めるときに問題に遭遇しますが、その方がより良い回答が得られます。
4大コンポーネントの使い方、Serviceの作成方法、レイアウト方法、簡単なカスタムView、アニメーション、ネットワーク通信などの共通技術などの基礎知識を習得する必要があります。
ゼロベースのチュートリアルの完全なセットが用意されています。必要な場合は、以下の QR コードを追加して無料で入手できます。
Android の基本チュートリアルの完全なセット