Android StudioのIntent Senderプラグむンずその個別の開発機胜の抂芁

Androidアプリケヌションを開発するずき、倚くの堎合、䜜業を最適化しお時間を節玄するためにadbに頌らなければなりたせん。 Adbは、たずえば、長いアクティビティチェヌンをバむパスしお、目的のアクティビティをすぐに実行したり、倖郚条件が満たされるのを埅たずにブロヌドキャストメッセヌゞを送信したりできる唯䞀のツヌルです。 adbを䜿甚するず、端末を䜿甚しお長いコマンドを生成するすべおの䞍䟿さが䌎い、デバむスにむンテントを送信する際にadbの凊理を高速化および簡玠化するプラグむンを䜜成するこずになりたした。



IntelliJ IDEAのプラグむンを開発する方法に関する情報ず詳现な説明を芋぀けるこずは問題ではないため、蚘事の最埌で、このトピックにいく぀かの段萜を圓おお、遭遇した機胜を瀺したす。 今、私の仕事の結果を説明したいず思いたす。



そのため、 Android Intent Senderは次のadbシェルコマンドに関連付けられおいたす。





これらのコマンドを送信するずきに、必芁なすべおのパラメヌタヌアクション、デヌタ、カテゎリ、コンポヌネント、MIMEタむプ、フラグおよび远加デヌタを備えたむンテントを添付できたす。



プラグむンの倖芳を、必芁なUI芁玠を備えた個別の䜜業りィンドりずしお蚭蚈するこずが決定されたした。 プラグむンぞのアクセスは、[衚瀺]-> [ツヌルりィンドり]メニュヌ、画面の巊䞋のアむコン、および右パネルから実行したす。



プラグむンの䞀般的な画像



プラグむンりィンドりは、デバむス/゚ミュレヌタヌ遞択りィンドり、むンテントパラメヌタヌセクション、コマンド送信甚のボタンのメむンセクションに分かれおいたす。 プラグむンは、デバむスが接続および切断されたずきにデバむスの自動曎新を実装したす。 むンテントパラメヌタセクションには、入力フィヌルドに加えお、履歎ボタンセクションタむトルの右偎、コンポヌネント入力フィヌルドの隣にある珟圚のプロゞェクトのクラスピッカヌ、フラグピッカヌ、远加のデヌタ远加ボタンがありたす。



珟圚のプロゞェクトのクラスピッカヌにより、コンポヌネント起動されたアクティビティなどの遞択が倧幅に簡玠化されたす。 ボタンをクリックするず、プロゞェクトクラスを含むりィンドりが開き、怜玢しおプロゞェクトツリヌに切り替えるこずができたす。 クラスを遞択するず、パッケヌゞの境界線に必芁な「/」セパレヌタが適切な堎所に自動的に眮き換えられたすたずえば、com.weezlabs.blabla / .MainActivity。



クラスピッカヌ画像



フラグピッカヌを䜿甚するず、むンテントに远加する1぀以䞊のフラグを遞択できたす。



フラグピッカヌの画像



デバむスにコマンドを送信するには、 「 ブロヌドキャストを送信」ボタン、 「アクティビティを開始 」ボタン、 「サヌビスを 開始 」ボタンを䜿甚したす。



䞀般的な堎合にadbを介しおアクティビティずサヌビスを開始するには、このコンポヌネントのマニフェストにandroid:exported=”true”



フラグをandroid:exported=”true”



必芁がありたすandroid:exported=”true”



。 ただし、刀明したように、゚クスポヌトされたフラグがfalseに蚭定されおいるコンポヌネントを実行できる゜リュヌションがありたす。 これを行うために、 「ナヌザヌの远加」フィヌルドがプラグむンに远加されたす。このフィヌルドには、ピッカヌからコンポヌネントが遞択されるず、パッケヌゞIDが自動的に眮き換えられたす。 残念ながら、䞀郚のデバむスではこの機胜が動䜜しない堎合がありたすこれはSamsungのほずんどのデバむスに圓おはたるようです。



プラグむンの可胜な甚途のいく぀かを怜蚎しおください。



  1. 攟送受信機のテスト
    ここではすべおが簡単です。必芁なパラメヌタヌを指定し、むンテントを送信したす。 たずえば、onReceiveのコヌドを持぀レシヌバヌがありたす。



     @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals("simple_intent_action")){ Log.d("SimpleReceiver", "Got intent with action: " + action + " and string extra: " + intent.getStringExtra("string_extra")); } }
          
          





    適切なIntentFilterを指定しおReceiverを登録したす。



     IntentFilter simpleFilter = new IntentFilter("simple_intent_action");
          
          





    次に、プラグむンでブロヌドキャストメッセヌゞを送信するには、アクションフィヌルドで「simple_intent_action」を指定し、 「Add extra」ボタンをクリックしお、 「string_extra」キヌずテキストで゚クストラを远加したす。 「ブロヌドキャストを送信」をクリックしお、ログで次のようなものを確認したす。

    Got intent with action: simple_intent_action and string extra: Awesome string





  2. 打ち䞊げ掻動、サヌビス
    MessageActivityを実行する必芁があるずしたす。䞀方、MessageActivityは、䜜成時に、意図からlong型の衚瀺メッセヌゞのIDを取埗したす。 idの远加デヌタのキヌ。「messageId」ずしたす。



    コンポヌネントピッカヌのプラグむンでこのアクティビティを開始するには、MessageActivityを遞択し、ナヌザヌが自動的に远加されるこずを確認したす。 次に、キヌ「messageId」ず目的の倀を持぀long型のオブゞェクトを远加したす。 すべおの準備が敎ったら、 「アクティビティを開始」をクリックしお、指定されたメッセヌゞが衚瀺された起動枈みアクティビティを確認したす。



    onCreateメ゜ッドのMessageActivityがログを曞き蟌む堎合



     Log.d(LOG_TAG, "Message id: " + getIntent().getLongExtra("messageId", -1));
          
          





    その埌、ログに衚瀺されたす

    Message data: 234





  3. 独自のデヌタスキヌマのテスト
    たずえば、フォヌムの特定のリンクをクリックしお、アプリケヌションの自動起動を実装する必芁がありたす myhost.com...





    /このために、マニフェストで、目的のアクティビティに次のむンテントフィルタヌを指定したす。



     <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" android:host="myhost.com"/> </intent-filter>
          
          





    呌び出されたアクティビティのonCreateメ゜ッドで、ログを远加したす。



     Log.d("TAG", "Intent data: " + getIntent().getDataString());
          
          





    次に、テストのために、プラグむンでaction android.intent.action.VIEW 、data myhost.com/some_dataを指定しお 、 Start Activityをクリックしたす。 デバむスで、アプリケヌションを遞択しおログを確認したす。

    Intent data: myhost.com/some_data







    「Test myhost.com/some_data 」ずいうテキストを含むSMSを送信し、リンクをクリックしおも同じこずがわかりたす 。
  4. Google Cloud MessagingGCMサヌビスのテスト
    GCMメッセヌゞを受信する特定のクラスGcmBroadcastReceiverがあるずしたす。 マニフェストぞのこのようなコンポヌネントの登録は、受信者蚱可android:permission="com.google.android.c2dm.permission.SEND"





    指瀺ずずもに枡されたすandroid:permission="com.google.android.c2dm.permission.SEND"





    android:permission="com.google.android.c2dm.permission.SEND"





    。

    残念ながら、テスト䞭にこの暩限を削陀する必芁がありたす。そうしないず、プラグむンからの意図が凊理されたせん。 マニフェストのフィルタヌは次のようになりたす。



     <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.your.package" /> </intent-filter>
          
          





    GCMむンテントの本文で、 「メッセヌゞ」キヌを含む文字列で枡されるjsonにデヌタがあるこずを想定しおいるずしたす。

    プラグむンにむンテントを䜜成したす。そのために、アクションcom.google.android.c2dm.intent.RECEIVEずカテゎリcom.your.packageを瀺したす。 キヌが「message_type」で倀が「gcm」の String型のフィヌルドず、キヌが「message」で内郚にjsonが枡されたString型のフィヌルドを远加したす 。



    「ブロヌドキャストを送信」をクリックするず、実際のGCMメッセヌゞを凊理するように、アプリケヌションはブロヌドキャストを受信しお​​凊理したす。



ご芧のずおり、堎合によっおは、プラグむンを䜿甚するこずで䞍合理な時間損倱を倧幅に枛らすこずができ、プラグむンが開発者の歊噚庫で本圓に圹立぀ツヌルになるこずを願っおいたす。



プラグむン開発プロセス自䜓に぀いおは、プラグむンに埋め蟌たれたアむデア自䜓を実装する耇雑さによっお耇雑さが決たるず蚀えたす。 環境を準備しお盎接蚭定しおも問題は発生せず、むンタヌネットには倚くの情報がありたす。 環境をセットアップするために必芁な手順を簡単に説明したす。





次に、IntelliJプラットフォヌムプラグむンタむプの新しいプロゞェクトを䜜成したす。IntelliJプラットフォヌムSDKドキュメント 、 Open APIおよびプラグむン開発コミュニティ 、ハブに関する倚数の蚘事、githubの䟋を䜿甚しお、プラグむンの䜜成を安党に開始できたす。



UI芁玠のswingフレヌムワヌクを䜿甚しお、toolWindowコンポヌネントに基づいおプラグむンを実装するこずにしたした。 JavaのUI、特にSwingでの䜜業に出䌚ったこずがない人ずしお、私はその機胜に少し適応する必芁がありたしたが、特別な困難はありたせんでした。 おそらく、AndroidのUIでの䜜業ずの類䌌性が圹立ったでしょう。



さらに、adbを操䜜するために、Android SDKの䞀郚であり、パス$ {SDK_HOME} / sdk / tools / libにあるddmlibラむブラリが非垞に圹立ちたした。 このディレクトリには他にも倚くのjarがありたすので、ご芧になるこずをお勧めしたす。突然、䞀郚のラむブラリがタスクの解決を簡玠化したす。 たた、 org.jetbrains.androidパッケヌゞにも泚目したす。これは、Androidパヌツを䜿甚する際に非垞に圹立ちたす。 そのため、圌の助けを借りお、Android SDKディレクトリぞのパスが取埗され、パッケヌゞがマニフェストから取埗されたした。 念のため、プラグむンはAndroid倉数ぞのパスをANDROID_HOME環境倉数で怜玢し、前の手順でSDKが芋぀からなかった堎合にパスを手動で蚭定する機胜も提䟛したす。 adbを䜿甚する堎合、プラグむンはコン゜ヌルの応答を解析したす。これにより、堎合によっおは送信が倱敗したこずを理解し、察応する゚ラヌを返すこずができたす。



コマンドの履歎を保存するために、プラグむン蚭定に保存されおいるjsonが䜿甚されたす。



Windows環境でのプラグむンの開発に関連しお、OS Xでプラグむンを起動したずきに、 NoSuchMethodExceptionでクラッシュするケヌスがいく぀かありたした。 その理由は、Windows甚のJavaずOS Xの違いです。OSXで䜜業しおいる同僚を劚害し、それらを䜿甚しおデバッグする必芁がありたした。



プラグむンをテストおよびデバッグした埌、jetbrainsプラグむンリポゞトリに远加するためにアプリケヌションが送信されたした。最初のファむルバヌゞョンはすぐにモデレヌションを経お、アプリケヌションの送信埌1時間以内にダりンロヌドできたした。



結論



驚いたこずに、プラグむンを曞いおも重倧な技術的な問題は発生したせんでした。 おそらく、オヌプンで䟿利なツヌルを䜜成したい、Androidの開発から切り替わった、たたは単なるむンスピレヌションが必芁になったのかもしれたせんが、プラグむンの開発は道埳的な改善をもたらし、しばらくの間、远加の前向きな姿勢で充電されたした。 プラグむンはすでに独立しおおり、非垞に機胜的ですが、プラグむンでの䜜業はただ完了しおいたせん。改善すべき点があり、他の有甚なプラグむンのアむデアがありたす。 プラグむンのTodoシヌト



Githubプラグむン github.com/WeezLabs/idea-intent-sender-plugin

バグトラッカヌずしお、 github issues  github.com/WeezLabs/idea-intent-sender-plugin/issuesを安党に䜿甚できたす。



プラグむンを改善するための提案やその実装に関する質問に加えお、䜿甚方法が明らかではないリストを補充できるこずを嬉しく思いたす。



All Articles