1. 程式人生 > >Android 監聽廣播autoLauch 防止啟動頁面被多次啟動(筆記)

Android 監聽廣播autoLauch 防止啟動頁面被多次啟動(筆記)

直接上程式碼:
1.監聽USB插入的廣播,這個廣播自己插入android收usb是觸發,當然我是監聽自定義廣播。
看下面manifest 配置,:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="come.lixby.autolaunchtest">

    <application
        android:allowBackup="true"
        android:icon
="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity" android:launchMode="singleTop"> <intent-filter> <action android:name
="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> <action
android:name="android.hardware.usb.action.DEATTACHED" />
</intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device" /> </activity> <activity android:name=".MainActivity2"></activity> </application> </manifest>

這個是系統廣播:

<intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                <action android:name="android.hardware.usb.action.DEATTACHED" />
            </intent-filter>

只接收usb插入廣播,自定義:

<meta-data
                android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device" />

我自己device的id:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- FTDI Chips -->
    <usb-device vendor-id="16981" product-id="0001"/>
</resources>

2.啟動頁面程式碼:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i("lixby","MainActivity isTaskRoot="+isTaskRoot());
        Log.i("lixby","MainActivity taskId="+getTaskId());
        //判斷是不是任務棧中根啟動頁,防止監聽到usb官博再次執行啟動
        //如果進到其他頁面按Home鍵退出,插拔USB觸發廣播,此頁面因接收到了廣播會啟動,而是不會顯示之前前臺的頁面,但是經測試啟動的PID和taskId並沒有改變,還是之前第一次啟動的。所以這裡判斷是不是根頁面,不是就finish調,會將後臺任務棧的棧頂Activity顯示出來。
        //原因:如果app沒有kill調不管是手動按手機桌面ICON圖示將任務回到前臺還是接受廣播回撥將任務回到前臺,APP是不會重新建立新的程序和任務的,原因自己Google或者百度AMS啟動Activity原理。
        if (!isTaskRoot()) {
            super.onCreate(savedInstanceState);
            finish();
            return;
        }

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i=new Intent(MainActivity.this,MainActivity2.class);
                startActivity(i);
                finish();

            }
        });

    }
}

3.MainActivity2

package come.lixby.autolaunchtest;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Log.i("lixby","MainActivity2 onCreate taskId="+getTaskId());
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("lixby","MainActivity2 onResume taskId="+getTaskId());
    }


}