0

我有一个需要在后台运行的间谍应用程序的客户端 - 接收收到的消息、发送的消息、gps 位置等。我可以在没有 Activity 用户界面的情况下启动服务吗?据我了解,我需要一个服务和接收器,我还需要打电话给接收器,比如说电池电量低,电池没问题 - 一些经常触发的意图。我怎样才能在模拟器上测试这个?

现在这就是我所拥有的

public class MyReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {

    if(intent.getAction() != null)
    {
        if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) ||
            intent.getAction().equals(Intent.ACTION_USER_PRESENT))
        {
            context.startService(new Intent(context, MyService.class));
        }
    // TODO Auto-generated method stub

}

} }

对于接收器和

public class MyService extends Service {

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this,"Service created ...",Toast.LENGTH_LONG).show();


}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.
    return START_STICKY;
}


@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service destroyed ...",
Toast.LENGTH_LONG).show();

}

}

为服务。我把它放在我的清单中

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.services"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="4"
    android:targetSdkVersion="4" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <service android:name=".MyService"></service>
    <receiver  android:name=".MyReceiver"></receiver>
</application>

我走的好吗?

4

2 回答 2

0

这个答案有两个部分:

可能在 Android 3.0 之前

在 Android 2.3 之前,应用程序可以为任何事件注册广播接收器,并且即使发生这种情况也会启动它们。这可以是启动完成,屏幕开/关,基本上任何东西。

在 3.0 及以上版本是不可能的

3.0 为接收事件广播引入了一个非常有用的条件。您的应用必须至少启动一次才能接收事件。如果用户安装了您的应用程序,但从未打开它,那么即使您在应用程序中为他们定义了接收器,您也不会收到任何广播。

另外,请记住,您的应用程序可以在任何时候被用户或系统本身强制停止。此外,运行 ICS 及更高版本的用户可以选择禁用应用程序,这可确保除非手动重新启用,否则它们将永远不会运行。您无法控制其中任何一种情况。

拥有一个万无一失的间谍应用程序的唯一方法是将其烘焙到设备上的 ROM 中,这在针对多个设备时不太可行。

于 2013-02-05T20:15:55.270 回答
0

是的 您可以在Service没有用户交互的情况下开始。但是你肯定需要一些东西来触发你的代码“你在哪里启动服务”对吗?

为此,我建议您再拥有一个具有非常频繁意图的 BroadcastReceiver,例如Phone_state_change"Incoming_mesage" Time_tick。所以当它发生时你会调用你的 onReceive 方法,你可以从那里启动你的服务,你需要检查服务是否还没有运行正确?

我会建议你定义一个sticky BroadcastReceiver. 它onReceive在注册后立即被调用,所以你也start来自service这里。

这就是我所做的,希望它对你有用。让我知道输出。

快乐编码。:)

于 2013-02-05T20:39:29.263 回答