我有一个客户端需要一个将在后台运行的间谍应用程序 - 接收消息,发送消息,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>
我的方式很好吗?
答案 0 :(得分:0)
这个答案有两个部分:
有可能在Android 3.0之前
Upto Android 2.3,应用程序可以为任何事件注册广播接收器,它们甚至会在发生时启动。这可以是启动完成,屏幕开/关,基本上任何东西。
3.0以上不可能
3.0为接收事件广播引入了一个非常有用的条件。您的应用必须至少已启动才会收到活动。如果用户安装了您的应用程序,但从未打开它,那么即使您在应用程序中为它们定义了接收器,也不会收到任何广播。
另外,请记住,您的应用可以在任何时间由用户或系统本身强制停止。此外,运行ICS及更高版本的用户可以选择禁用应用程序,这可确保除非手动重新启用,否则它们将永远不会运行。你无法控制这两种情况。
拥有一个万无一失的间谍应用程序的唯一方法是将其烘焙到设备的ROM中,这在针对多个设备时不太可行。
答案 1 :(得分:0)
是您可以在没有用户互动的情况下启动Service
。但是你肯定需要一些东西才能触发代码“你启动服务的地方”吧?
为此,我建议您再次使用一个非常频繁的BroadcastReceiver,例如Phone_state_change
,"Incoming_mesage"
Time_tick
。所以当它发生时你会调用你的onReceive方法,你可以从那里开始你的服务,你需要检查服务是否还在运行吗?
我建议您定义sticky
BroadcastReceiver
。注册后它会立即调用onReceive
,因此您start
也可以service
来自此处。{/ p>
这就是我所做的,希望它对你有用。让我知道输出。
快乐的编码。 :)