一、首先介紹一下如何開機啟動:
第一種: 監控RECEIVE_BOOT_COMPLETED,即開機啟動事件
第二種: 監控sd卡mount事件 開機總會掃描sd卡吧? 監控sd卡事件也有類似開機啟動效果,特別app安裝在sd卡的情況下有些os是抓取不到RECEIVE_BOOT_COMPLETED
第三種: android:installLocation="internalOnly", 限制app的安裝位置,使其能抓取到RECEIVE_BOOT_COMPLETED
我們也可以同時使用上面的方法
<receiver android:name="com.example.receiver.SystemEventReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /> //監聽開機啟動
</intent-filter>
<intent-filter>
<action android:name="RestartSerivcesForSystemEventReceiver" /> //監聽系統服務的重啟
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" /> //媒體安裝,即sd卡的加載(僅個人翻譯加猜想)
<action android:name="android.intent.action.MEDIA_UNMOUNTED" /> //媒體卸載,即sd卡卸載
<action android:name="android.intent.action.MEDIA_EJECT" /> //媒體彈出,即sd卡彈出
<data android:scheme="file" >
</data>
</intent-filter>
</receiver>
二、由於廣播不能單獨的存在,必須要有相應的activity,我們可以在清單文件里修改activity的<category android:name="android.intent.category.DEFAULT" />,這樣在安裝的時候就不會存在圖標了,然后靜態注冊監聽開機事件,一開機就啟動服務或者應用程序,這樣我們就相當於完成了一個”沒有activity的開機自啟動其他應用程序或者啟動某服務”
同理也可以實現,沒有圖標監聽某些事件而采取相應操作。
服務里也能啟動應用程序,activity和service都是繼承context的,所有需要context的時候可以用this,broadcastreceiver是繼承object的,但是在接受廣播的時候會傳進context和intent,所有也可以啟動其他的服務或者應用程序。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.startselfreceiver"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.startselfreceiver.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service
android:name=".Myservice"
>
<intent-filter >
<action android:name="myservice"/>
</intent-filter>
</service>
<receiver
android:name=".Myreceiver"
>
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
廣播文件:
package com.example.startselfreceiver;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.widget.Toast;
public class Myreceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("收到廣播了");
Intent startserviceintent=new Intent("myservice"); //啟動服務
context.startService(startserviceintent);
PackageManager p=context.getPackageManager();
Intent in=p.getLaunchIntentForPackage("com.example.secondapp"); // 啟動其他應用程序
if(in!=null)
{
context.startActivity(in);
}
else
{
Toast.makeText(context, "喲,趕緊下載安裝這個APP吧", Toast.LENGTH_LONG).show();
}
// Intent intent2 = new Intent("android.intent.action.MAIN");
// intent2.addCategory("android.intent.category.LAUNCHER");
// ComponentName cn = new ComponentName("com.example.secondapp", "com.example.secondapp.MainActivity");
// intent2.setComponent(cn);
// context.startActivity(intent2);
}
}
服務文件:
package com.example.startselfreceiver;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Service;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.os.IBinder;
public class Myservice extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("服務啟動!");
return null;
}
@Override
public void onCreate() {
super.onCreate();
try {
// System.out.println(Environment.getDataDirectory().getAbsolutePath());
OutputStream out=openFileOutput("zp.txt", MODE_PRIVATE);//Environment.getDataDirectory().getAbsolutePath()+,輸出流只能在工程目錄下創建文件,前面的參數 //不能包含路徑
String st="my name is zp";
out.write(st.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
}
