默認開機啟動;通過Broadcastreceiver廣播監聽開機啟動,實現"沒有activity"的自啟服務或者自啟應用程序。


一、首先介紹一下如何開機啟動:

第一種:  監控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();
			}
		
	}

}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM