2012-03-29 25 views
7

Tôi muốn bắt đầu một Intent động. Do đó, setClassName có vẻ là lựa chọn tốt nhất.Không thể bắt đầu Mục đích mới bằng setClassName với gói khác trong Android

Trước tiên, tôi xác định 3 hoạt động trong Manifest

<activity android:name="com.example.pkg2.Act" /> 
<activity android:name="com.example.pkg1.Act1" /> 
<activity android:name="com.example.pkg1.Act2" /> 

Từ com.example.pkg2.Act:

Intent intent = new Intent(); 
if(index == 0) intent.setClassName(Act.this, "com.example.pkg1.Act1"); 
else intent.setClassName(Act.this, "com.example.pkg1.Act2"); 
startActivity(intent); 

Và sẽ nhận được ngoại lệ này:

Unable to find explicit activity class {com.example.pkg2.Act/com.example.pkg1.Act1}; have you declared this activity in your AndroidManifest.xml? 

Dường như chúng ta chỉ có thể sử dụng setClassName để tự động bắt đầu Hoạt động mới nhưng trong cùng một gói.

Bất kỳ ý tưởng nào để giải quyết vấn đề này? Tất cả trợ giúp đều được đánh giá cao.

+0

'' thay đổi Act1 để Act2 bạn đã tuyên bố Act1 hai lần? –

+0

Cảm ơn @imrankhan Đó là lỗi của tôi khi sao chép-dán: p – anticafe

+0

không sao, hãy xem câu trả lời cập nhật của tôi. –

Trả lời

12

setClassName mất một bối cảnh trọn gói như param đầu tiên setClassName(Context packageContext, String className):

Intent intent = new Intent(); 
if(index == 0) { 
    intent.setClassName("com.example.pkg1", "com.example.pkg1.Act1"); 
} else { 
    intent.setClassName("com.example.pkg1", "com.example.pkg1.Act2"); 
    startActivity(intent); 
} 

và trong

<activity android:name="com.example.pkg2.Act" /> 
<activity android:name="com.example.pkg1.Act1" /> 
<activity android:name="com.example.pkg1.Act2" /> 

hoặc bạn cố gắng này:

if(index == 0) { 
    Intent intent = new Intent(Intent.ACTION_MAIN) 
    .addCategory(intent.CATEGORY_LAUNCHER) 
    .setClassName("com.example.pkg1", "com.example.pkg1.Act1") 
    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 
    .addFlags(Intent.FLAG_FROM_BACKGROUND) 
    .setComponent(new ComponentName("com.example.pkg1", "com.example.pkg1.Act1")); 
    getApplicationContext().startActivity(intent); 
} else { 
    Intent intent = new Intent(Intent.ACTION_MAIN) 
    .addCategory(intent.CATEGORY_LAUNCHER) 
    .setClassName("com.example.pkg1", "com.example.pkg1.Act2") 
    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 
    .addFlags(Intent.FLAG_FROM_BACKGROUND) 
    .setComponent(new ComponentName("com.example.pkg1", "com.example.pkg1.Act2")); 
    getApplicationContext().startActivity(intent); 
} 
+0

Xin lỗi, nó không hoạt động. Các lỗi tương tự: -s – anticafe

0

Thực hiện theo các cú pháp để viết setClassName() phương pháp:

setClassName(pkgName, className) 
+0

Cảm ơn câu trả lời của bạn nhưng nó cũng không hoạt động. – anticafe

-1
intent.setClassName(Act.this, Act1.class); 
0

Bạn có thể sử dụng phương pháp sau đây để tạo ra mục đích trong bối cảnh gói:

Intent intent = new Intent(this, MyActivity.class); 
    intent.setAction(Intent.ACTION_VIEW); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 

Bằng cách này bạn tiếp tục mã chung.

HTH

0

intent.setClassName (packageName, className);

trong đó
packageName - Tên của gói thực hiện thành phần mong muốn, tức là gói nơi người gọi thuộc về.
className - tên đầy đủ của lớp [từ gói khác nhau]

Gọi từ com.example.pkg2.Act:

intent.setClassName("com.example.pkg2", "com.example.pkg1.Act1"); 
2

Các param đầu tiên là applicationId nằm ở build.gradle tập tin

Tham số thứ hai là đường dẫn đầy đủ của lớp với gói của nó. ví dụ: intentObj.setClassName ("applicatioId", "com.youCompany.yourAppName.YourClassName")

0

Sử dụng mã này và bạn sẽ bị phạt.

Intent intent = new Intent(); 
String resourcePackageName = getResources().getResourcePackageName(R.string.some_defined_resource); 
intent.setClassName(getApplicationContext().getPackageName(),resourcePackageName + ".SubPackageName[/if any/].ClassName"); 
startActivity(intent); 
0

Bạn cũng có thể khởi chạy Hoạt động theo cách này. Hãy thử điều này

Intent intent = new Intent(); 
Class<?> activityClass = Class.forName("your.application.package.name." + NameOfClassToOpen); 
intent.setClass(this, activityClass); 

Và để sử dụng setClassName. Bạn nên cung cấp nó với PACKAGENAME và đường dẫn lớp của nó quá như

intent.setClassName("your.application.package.name", "your.application.package.name.activityClass"); 
Các vấn đề liên quan