gpt4 book ai didi

android - bindService强制关闭

转载 作者:行者123 更新时间:2023-11-29 02:11:31 25 4
gpt4 key购买 nike

总体而言,我对 Android 编程和 Java 还比较陌生,但作为系统级 C 编码器,我拥有丰富的经验。我想创建一个 API 或库,供我计划开发的一套 Android 应用程序使用,经过大量研究后,我决定绑定(bind)服务是 Android 的方式(我通常会创建一个 .so或 .dll)。如果这个假设不正确,那么我的整个问题很可能没有实际意义。

无论如何,我在一个项目中创建了我的服务框架,并在另一个项目中创建了一个 Activity 来测试该服务。我通过调用 Toast 取消了服务的 handleMessage() 方法,只是为了查看它是否正常工作,然后向我的 Activity 添加了两个按钮:一个用于绑定(bind)服务,第二个用于解除绑定(bind)。由于无法看到我的服务而无法运行我的 Activity 大约一个小时后,我想出了如何让 Eclipse 从 Activity 中查看服务的源代码,并认为我的方式很好。然后我运行了该 Activity 。

一切看起来都很好。两个按钮,一个绑定(bind),一个解除绑定(bind)。但是,当我按下绑定(bind)按钮时,它强制关闭了应用程序。我使用调试器查看发生了什么,它强制关闭了我 Activity 中的 bindService() 调用。当然,bindService() 调用是从另一个示例复制而来的,其中在同一行创建了一个新的 Intent(),所以我将两行代码分开,当我真的尝试创建 Intent。

这是我的 Activity 代码:

package net.william.android.myAPI.tester;

import net.william.android.myAPI.MyApiService;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Toast;

public class MyApiTester extends Activity
{
boolean mIsBound = false;

private ServiceConnection mConnection = new ServiceConnection()
{
public void onServiceConnected(ComponentName className, IBinder service)
{
Toast.makeText(FaceClientTester.this, "Remote Service Connected", Toast.LENGTH_SHORT).show();
}

public void onServiceDisconnected(ComponentName className)
{
Toast.makeText(FaceClientTester.this, "Remote Service Disconnected", Toast.LENGTH_SHORT).show();
}
};

public void doBindService(View view)
{
if (!mIsBound)
{
Toast.makeText(this, "Binding Service", Toast.LENGTH_SHORT).show();
Intent myIntent = new Intent(MyApiTester.this, MyApiService.class);
bindService(myIntent, mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
}
}

public void doUnbindService(View view)
{
if (mIsBound)
{
unbindService(mConnection);
mIsBound = false;
Toast.makeText(this, "Service Unbound", Toast.LENGTH_SHORT).show();
}
}

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
return;
}
}

这是我的服务代码:

package net.william.android.myAPI

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.widget.Toast;

public class MyApiService extends Service
{
static final int API_FN_1 = 101;
static final int API_FN_2 = 102;

class MyApiHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case API_FN_1:
ApiFn1();
break;
case API_FN_2:
ApiFn2();
break;
default:
super.handleMessage(msg);
break;
}
}
}

final Messenger myMessenger = new Messenger(new MyApiHandler());

@Override
public void onCreate()
{
Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
}

@Override
public void onDestroy()
{
Toast.makeText(this, "Service Stopped", Toast.LENGTH_SHORT).show();
}

@Override
public IBinder onBind(Intent intent)
{
Toast.makeText(this, "Service Bound", Toast.LENGTH_SHORT).show();
return myMessenger.getBinder();
}

private void ApiFn1()
{
Toast.makeText(this, "API Function 1", Toast.LENGTH_SHORT).show();
return;
}

private void ApiFn2()
{
Toast.makeText(this, "API Function 2", Toast.LENGTH_SHORT).show();
return;
}
}

我更改了一些东西的名称,但到目前为止,这确实是我的代码的核心。只是对 Toast 的一堆调用,这样我就有希望看到它正在运行。

我找到的关于该主题的所有教程都完全忽略了 list 。昨晚我四处闲逛,试图调整 list 选项,认为这可能与它有关,但无济于事。无论如何,为了完整起见,以下是该 Activity 的 list 代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.william.android.myAPI.tester"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MyApiTester" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

和服务:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.william.android.myAPI"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<service android:name=".MyApiService"></service>
</application>
</manifest>

我尝试在 <service> 中添加以下内容阻止,但它似乎没有帮助:

            <intent-filter>
<action android:name="net.william.android.myAPI.MyApiService" />
</intent-filter>

无论如何,这是我在您的论坛上发表的第一篇文章,所以如果信息太多或太少,或者如果我错过了网上某个地方的一些非常简单的修复程序,我深表歉意。大部分时间我都在阅读 Google 提供的所有服务文档,并阅读论坛中的帖子,所以,在这一点上,我很容易忽略一些东西。在此先感谢抽出时间提供帮助的任何人!

最佳答案

如果这些要作为两个单独的 APK 文件分发,如您的一对 list 所示,您不能使用 Intent以 Java 类作为参数的构造函数。这甚至可以编译这一事实表明您的项目设置有些可怕——从构建时的角度来看,您的客户不应该在您服务的国家英里范围内。

添加 <intent-filter>给你的<service>宣传您希望如何连接,并在您的客户端中使用该结构用于 Intent它创造。

例如,在这对sample projects ,服务有:

<service android:name=".BshService">
<intent-filter>
<action android:name="com.commonsware.android.advservice.IScript" />
</intent-filter>
</service>

因此客户使用:

new Intent("com.commonsware.android.advservice.IScript")

关于android - bindService强制关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7042005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com