2017-07-22 18 views
0

私はずっとスカウトしていますが、開始されたサービスを使ってfinal()を呼び出したり、バインドされたサービスを使用していないときは情報を見つけることができません。バインドされたサービスにはたくさんの情報がありますが、私はすでに2つの大きな「開始済みサービス」をバインディングなしで持っているため、絶対に必要以上に既存のサービスを変更したくありませんでした。Androidスタジオ - サービスを使用してfinal()とFLAG_ACTIVITY_NEW_TASKを呼び出す

私のアプリは、10秒ごとにBluetoothデータを読み取って動作し、読み取られたデータに応じて、サービスは新しい動作に変更されます。しかし、私は私のサービスからfinal()を呼び出すことはできませんので、アプリケーション/サービスの実行中に無限にアクティビティを積み重ねる恐れがあります。

アクティビティを変更するには、Intent.FLAG_ACTIVITY_NEW_TASKを追加する必要がありました。開発者のページの下の画像/定義を考慮すると、この旗は既にスタッキングの問題を処理しているようですね。私はすべてが確認/キャンセルボタンとサービスを介して処理されるので、ユーザーは自分の携帯電話で戻るボタンを使用することはできません。私のアプリはいくつかの理由でこの方法でなければなりません。したがって、スタックの順序を維持することは私のアプリケーションにとって重要ではありません。

enter image description here

キーポイント - 私のサービスを経由して活動を開始するときに「新しいタスクを」フラグを付ける新たな活動

  • を開始するときに、私は延々と活動を積み重ねていないよ確実にしたい

    • スタックの順序は私のアプリケーションにとって重要ではありません

    以下は私がしようとしていることを説明するためのコメント付きの私のコードのごく一部です。このサービスのonDestroy()メソッドを確認してください。アンドロイドを使用して - taskAffinity:taskAffinityは、このような状況で私を助けにはなりませんアンドロイドを使用するための勧告を経由して

    public class AlertService extends Service { 
    
        final class Threader implements Runnable{ 
         // Scans bluetooth advertisement packets every 10 seconds 
         // Thread Runs until interrupted 
         // Stops service via service ID 
         stopSelf(this.serviceID); 
        } 
    
        @Override 
        public void onCreate(){ 
         super.onCreate(); 
        } 
    
        // Runs a thread until alert is found. 
        // Alert calls thread.interrupt() 
        @Override 
        public int onStartCommand(Intent intent, int flags, int startID){ 
         enableBluetooth(); 
    
         // Start Thread 
         thread = new Thread(new Threader(startID)); 
         thread.start(); 
    
         return START_STICKY; 
        } 
    
        @Override 
        public void onDestroy(){ 
         thread.interrupt(); 
         Intent alertActivity = new Intent(this, AlertActivity.class) 
         alertActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         startActivity(alertActivity); 
        } 
    
        // Unused Method - We will not be binding 
        @Nullable 
        @Override 
        public IBinder onBind(Intent intent) { 
         return null; 
        } 
    } 
    

    EDIT。デフォルトでは、アプリケーション内のすべてのアクティビティは同じ親和性を持ちます。インテントフラグにIntent.FLAG_ACTIVITY_NEW_TASKを設定して新しいタスクを作成すると、そのアクティビティがそのタスクのルートアクティビティと同じtaskAffinityを持つ場合、新しいアクティビティは同じタスクで開始されます。私はちょうど既定の親和性を使用しているので、すべてが通常のスタックフローを持つ必要があります。私はfinish()を呼び出すことはできません。つまり、私はたくさんのアクティビティを積み上げています。

  • +0

    いつでも戻ってスタック上に一つだけAlertActivityを持つようにしたいですか? – Sunhee

    +0

    @Sunheeアプリケーションは "Home Service"が起動して開始します。アラートが見つかると、ホームサービスが停止し、新しいアクティビティが作成され、「アラートサービス」が開始されます。ただし、アラートサービス中に多くのアクティビティが作成されることがあります。通常、アラート画面でアラートが発行されますが、定期的な更新を行うために新しいアクティビティが作成されます。その後、アラートサービスが終了し、ホームサービスとホームアクティビティが再開され、「すべてクリア」というメッセージが表示されます。 – FoxDonut

    +0

    AlertActivityを1つしか起動しない場合は、Manifest.xmlでandroid:taskAffinityとandroid:excludeFromRecentsをAlertActivityに設定する必要があります。 **しかし、**、あなたのソース、ホームサービスが停止しAlertActivityソースの後に作成された活動ソースを表示してください? – Sunhee

    答えて

    0

    私自身の質問に答えるために、Intent.FLAG_ACTIVITY_NEW_TASK経由で呼び出された新しいアクティビティは、それぞれのアクティビティの新しいインスタンスを作成し、それをスタックに置くことでした。これは本当です。しかし、それぞれの活動は私の恐れの一つであった新しい仕事を作っていません。

    インテントフラグにIntent.FLAG_ACTIVITY_NEW_TASKを設定して新しいタスクを作成すると、新しいアクティビティが同じタスクを持つ場合は、新しいアクティビティは同じタスク(新しいタスクではない)で開始されますタスクの中で。私はデフォルトアフィニティを使用しているだけなので、私が作成したすべてのアクティビティは同じタスクに入れられています。これは、アクティビティなどを作成する通常のフローとは異なる動作をするものは何もないことを意味します。

    私は自分のアプリケーションに戻るボタンを無効にしているので、新しいタスクにフラグを立てることによって作成されたこれらのアクティビティは、完了、破棄、またはスタックから削除されません。これを解決するために、FLAG_ACTIVITY_CLEAR_TOPを使用します.FLAG_ACTIVITY_CLEAR_TOPは、スタック内のアクティビティの実行インスタンスを検出し(存在する場合)、その上のすべてのアクティビティを閉じます。

    私のアプリケーションは常にホーム画面から始まり、ホーム画面で終了します。「クリアトップ」とマークすると、常にホーム画面上のすべてのアクティビティが閉じられます。したがって、ホーム画面に戻ると、スタック上の唯一の項目はホーム画面になります。

    私はこれをテストする必要がありますが、私はこの結果を得るために私のホームアクティビティからfinish()を呼び出さないようです - そうでなければ、ホームアクティビティに戻ったときにスタックのすべてがクリアされるわけではありません。

    enter image description here

    関連する問題